python模块可以有一个__repr__吗?我的想法是做类似的事情:
import mymodule
print mymodule
编辑:精确:我的意思是用户定义的 repr!
答案 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__
,它不会被调用!