我正在使用我创建的模块尝试 IPython,但它没有显示类对象的实际表示。相反,它显示类似的内容
TheClass.__module__ + '.' + TheClass.__name__
I heavily在这个模块中使用元类,我有真正有意义的类表示,应该向用户显示。
是否有一个 IPython 特定方法可以更改以提供正确的表示形式,而不是在此应用程序中毫无用处的命名空间?
或者,如果不可能,我如何自定义我的 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
我尝试过的事情:
- 添加
_repr_pretty_
函数到元类。它确实适用于实例,但不适用于类......
- 使用此功能IPython.lib.pretty http://ipython.org/ipython-doc/dev/api/generated/IPython.lib.pretty.html
.for_type(typ, func)
。它只改变了上面写的大字典,但没有改变它的副本RepresentationPrinter
实例...所以这个功能根本没有用吗?!
- 调用魔法函数
%pprint
。它使用默认的 Python 禁用(或启用)这个漂亮的打印功能__repr__
对于所有对象。这很糟糕,因为列表、字典和许多其他内容的漂亮打印非常好。
第一种方法更符合我的要求,因为它不影响环境并且是针对此类的。