2

我正在使用我创建的模块尝试 IPython,但它没有显示类对象的实际表示。相反,它显示类似

TheClass.__module__ + '.' + TheClass.__name__

我在这个模块中大量使用元类,并且我有真正有意义的类表示应该向用户展示。

是否有一个 IPython 特定的方法我可以更改以使正确的表示可用,而不是这个在这个应用程序中非常无用的命名空间?

或者,如果这不可能,我如何自定义我的 IPython 版本以显示我想要的信息?


编辑

作为补充信息,如果我得到一个类并将__module__属性更改为例如 None,则在尝试显示表示时它会因此回溯而崩溃:

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。它禁用(或启用)这个漂亮的打印功能,__repr__对所有对象使用默认的 Python。这很糟糕,因为列表、dict 和许多其他的漂亮打印非常好。

第一种方法更符合我的要求,因为它不会影响环境并且是针对此类的。

4

1 回答 1

1

这只是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.

于 2012-09-04T15:13:13.740 回答