python模块可以有__repr__吗?

时间:2009-11-12 21:24:17

标签: python module

python模块可以有一个__repr__吗?我的想法是做类似的事情:

import mymodule
print mymodule

编辑:精确:我的意思是用户定义的 repr!

5 个答案:

答案 0 :(得分:8)

简短回答:基本上答案是肯定的。

但是你不能找到使用docstrings寻找的功能吗?

testmodule.py
""" my module test does x and y
"""
class myclass(object):
    ...
test.py
import testmodule
print testmodule.__doc__

答案很长:

您可以在模块级别定义自己的__repr__(只提供def __repr__(...),但您必须这样做:

import mymodule
print mymodule.__repr__() 

获得您想要的功能。

看看下面的python shell会话:

>>> import sys                 # we import the module
>>> sys.__repr__()               # works as usual
"<module 'sys' (built-in)>"
>>> sys.__dict__['__repr__']     # but it's not in the modules __dict__ ?
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
KeyError: '__repr__'
>>> sys.__class__.__dict__['__repr__'] # __repr__ is provided on the module type as a slot wrapper
<slot wrapper '__repr__' of 'module' objects>
>>> sys.__class__.__dict__['__repr__'](sys) # which we should feed an instance of the module type
"<module 'sys' (built-in)>"

所以我认为问题在于slot wrapper objects这些(从链接中可以阅读的内容)有绕过通常的'python'方式查找项属性的结果。

对于这些类方法,CPython返回指向这些对象上相应方法的C指针(然后将其包装在插槽包装器对象中,以便从python端调用)。

答案 1 :(得分:4)

模块可以具有__repr__函数,但在获取模块的表示时不会调用它。

所以不,你不能做你想做的事。

答案 2 :(得分:4)

你可以达到这个效果 - 如果你愿意转向力量的黑暗面。

将此添加到 mymodule.py:

import sys

class MyReprModule(mymodule.__class__):
  def __init__(self, other):
    for attr in dir(other):
      setattr(self, attr, getattr(other, attr))

  def __repr__(self):
    return 'ABCDEFGHIJKLMNOQ'

# THIS LINE MUST BE THE LAST LINE IN YOUR MODULE
sys.modules[__name__] = MyReprModule(sys.modules[__name__])

瞧瞧:

>>> import mymodule
>>> print mymodule
ABCDEFGHIJKLMNOQ

我朦胧地记得,在之前的类似邪恶黑客的尝试中,无法设置__class__等特殊属性。测试时我没有那么麻烦。如果您遇到该问题,只需捕获异常并跳过该属性。

答案 3 :(得分:2)

事实上,许多模块[有一个__repr__]!

>>> import sys
>>> print(sys)
<module 'sys' (built-in)>    #read edit, however, this info didn't come from __repr__ !

还可以尝试dir(sys)查看__repr____name__等一起。

修改
似乎可以在Python 3.0及更高版本的模块中找到__repr__ 正如Ned Batchelder所指出的,当打印出一个模块时,Python使用的这些方法。 (快速实验,重新分配了 repr 属性表明......)

答案 4 :(得分:1)

不,因为__repr__是一种特殊方法(我称之为功能),并且它只是在类上查找。你的模块只是模块类型的另一个实例,所以你设法定义一个__repr__,它不会被调用!