2012-09-03 14 views
2

我正在嘗試IPython與我創建的模塊,它不顯示類對象的實際表示形式。相反,它表明類似類的IPython表示

TheClass.__module__ + '.' + TheClass.__name__ 

巨資在該模塊中使用元類和我有什麼意義類表示應顯示給用戶。

是否有一個IPython特定的方法,我可以改變,使正確的表示可用,而不是這個名字空間thingy,這是在這個應用程序中是無用的嗎?或者,如果這是不可能的,我如何定製我的IPython版本來顯示我想要的信息?


EDIT

作爲補充信息,如果我得到一個類和改變__module__屬性到例如

Traceback (most recent call last): 
    ... [Huge traceback] ... 
    File "C:\Python32\lib\site-packages\IPython\lib\pretty.py", line 599, in _type_pprint 
    name = obj.__module__ + '.' + obj.__name__ 
TypeError: unsupported operand type(s) for +: 'NoneType' and 'str' 

所以,我的期望是正確的,這個功能是用來顯示類對象:

def _type_pprint(obj, p, cycle): 

我試圖在我的課定製它沒有,它有這個回溯時,試圖展現表示吹但我認爲我沒有做對。該模塊IPython.lib.pretty確實有一個大的詞典鏈接type(元類的父親)與此功能。


EDIT 2

事情我想:

  1. 添加_repr_pretty_函數元類。它可以與實例協同工作,但不適用於類...
  2. 使用此功能IPython.lib.pretty.for_type(typ, func)。它只會改變上面寫到的大字典,而不會改變RepresentationPrinter實例的副本......所以這個函數根本沒有用處?!
  3. 調用魔術功能%pprint。它禁用(或啓用)這個漂亮的打印功能,對所有對象使用默認的Python __repr__。這很糟糕,因爲漂亮的列表,字典和其他許多人都很好。

第一種方法更多的是我想要的,因爲它不會影響環境並且是特定於此類的。

+0

你是什麼意思的「代表」?你的意思是你的班上有一個'__repr__',它沒有被調用? – BrenBarn

+0

@BrenBarn:[在元類上](http:// stackoverflow。com/q/4932438/20862) –

+0

@BrenBarn我在**元類**中有一個'__repr__',它並不像普通的Python shell那樣叫它 – JBernardo

回答

1

這只是一個issue與IPython 0.12和舊版本。現在是可以做到的:

class A(type): 
    def _repr_pretty_(cls, p, cycle): 
     p.text(repr(self)) 

    def __repr__(cls): 
     return 'This Information' 

class B: #or for Py3K: class B(metaclass=A): 
    __metaclass__ = A 

,它會顯示B所需的表示。