2013-01-09 24 views
3

剛進入Python,我驚訝地發現,似乎沒有一個明顯的方式來正確檢查數據結構,你可以使用Perl的Data :: Dumper模塊。相當於Data :: Dumper的Python - 轉儲原始數據結構以進行檢查?

例如,pprint將顯示對象的__repr__返回值,而不是告訴我該值是一個對象以及它是什麼類型的對象。

Data :: Dumper會告訴你究竟是什麼數據結構包含什麼,而不是將對象靜靜地轉換爲字符串,這對於數據檢查目的來說絕對沒有用處。

有沒有什麼辦法在Python中打印原始數據結構的轉儲?我想我可以自己創造一些東西,本質上它需要做的就是走一個數據結構,但是一定有什麼能夠做到這一點呢?

編輯:這是__repr__,pprint解決,而不是__str__,因爲我最初說,至少..事實上?

所以,我認爲我真正需要的是pprint忽略__repr__定義。這是否存在?

+0

它並不能完全解決您的問題,但你可能找到[inspect](http://docs.python.org/2/library/inspect.html)模塊有用,特別是[inspect.getmembers()](http://docs.python.org/2/library/ inspect.html#inspect.getmembers)。用一點粘合劑,這可以讓你自己做深入的反省。 – Cartroo

+0

對我來說,[pickle](http://docs.python.org/2/library/pickle.html)模塊不會被覆蓋'__repr __()'所迷惑,因此檢查可能的源代碼產生一些有用的實用功能。但是,仍然不是您希望的預打包解決方案。 – Cartroo

回答

2

pprint

from pprint import pprint 
pprint(someVar) 

確定。我沒有更好的答案。我總是使用'​​pprint'或'pformat'。您可以從字符串輸出中推斷出該類型。我認爲從產出中知道這種類型的技能是一種可行的方法。

或如您所說,您自己的print(type(v), v)

使用python,哲學似乎是這樣的:「不要太依賴類型,只需獲取一個對象並使用它,讓運行時(測試)告訴用戶它們是否已被分離」:http://en.wikipedia.org/wiki/Duck_typing#In_Python


看完評論後。

爲什麼不猴補丁你想看到打印一些有用的東西類:

class Person(object): 
    def __init__(self, name, age): 
     self.name = name 
     self.age = age 

    def __repr__(self): 
     return "Muahaha" 

def main(): 
    s = Person("Santa", 1500) 
    from pprint import pprint 
    pprint(s) 

    print 
    print ".. Go MONKEYS ..." 
    print 

    # Monkey patch the Person class so it prints nice info from now on 
    Person.__repr__ = lambda p: "<%s name='%s' age=%s>" % (p.__class__.__name__, p.name, p.age) 
    pprint(s) 

if __name__ == '__main__': 
    main() 

- 輸出 -

[email protected]:~/tmp$ python monkey.py 
Muahaha 

.. Go MONKEYS ... 

<Person name='Santa' age=1500> 
+0

我遇到了一個問題,泡菜在嘔吐,試圖「排出」一系列的口水。當我打印數據結構時,它顯示了一堆unicode字符串。實際上,這些「unicode字符串」是帶有\ __ repr__(或* maybe * \ __ str__?)方法的對象,它返回一個unicode字符串。如果沒有手動遍歷數據結構並使用'type()',我看不到這種情況,因爲'pprint'很糟糕! –

+0

@PeteD - 這是班級作家選擇以無用的方式覆蓋'__repr__'的錯。這不是'pprint'的錯誤:) – mgilson

+1

@mgilson問題似乎是'pprint'實際上不應該用於數據檢查,它應該是一種傾銷數據結構的方式「,可以使用的形式作爲口譯員的輸入。「但我想要的是能夠查看數據結構的原始轉儲以進行調試,而不是將其反饋給解釋器。如果'pprint'用於調試,那麼依賴\ __ repr__函數會很糟糕。 –

相關問題