我正在用我创建的模块尝试 IPython,它没有显示类对象的实际表示。相反,它显示类似
TheClass.__module__ + '.' + TheClass.__name__
我在这个模块中大量使用元类,并且我有真正有意义的类表示应该向用户显示。
是否有一个 IPython 特定的方法我可以更改以提供正确的表示而不是这个在这个应用程序中毫无用处的命名空间?
或者,如果这不可能,我如何自定义我的 IPython 版本以显示我想要的信息?
编辑
作为补充信息,如果我得到一个类并将 __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(元类的父级)与此函数链接起来。
编辑 2
我尝试过的事情:
- 将
_repr_pretty_函数添加到元类。它确实适用于实例,但不适用于类... - 使用这个功能
IPython.lib.pretty.for_type(typ, func)。它只改变了上面写的大字典,而不是RepresentationPrinter实例制作的副本......所以这个功能根本没有用?! - 调用魔术函数
%pprint。它禁用(或启用)这个 pretty-print 功能,对所有对象使用默认的 Python__repr__。这很糟糕,因为列表、字典和许多其他内容的 pretty-print 非常好。
第一种方法更符合我的要求,因为它不影响环境,而且是针对这个类的。
请您参考如下方法:
这只是一个 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 所需的表示形式。
