IPython表示类

时间:2012-09-03 05:42:20

标签: python ipython metaclass

我正在尝试使用我创建的模块进行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

我尝试的事情:

  1. _repr_pretty_函数添加到元类。它适用于实例但不适用于类...
  2. 使用此功能IPython.lib.pretty .for_type(typ, func)。它只会更改上面写的大字典而不是RepresentationPrinter实例制作的副本...所以这个函数根本没用?!
  3. 调用魔术函数%pprint。它使用所有对象的默认Python __repr__禁用(或启用)这个漂亮的打印功能。这很糟糕,因为列表,字典和许多其他内容的漂亮打印非常好。
  4. 第一种方法更多是我想要的,因为它不会影响环境,并且特定于此类。

1 个答案:

答案 0 :(得分: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的所需表示形式。