当您在Python中打印对象时,用户未定义__repr__
和__str__
时,Python会将对象转换为字符串表示形式,并用尖括号分隔...
<bound method Shell.clear of <Shell object at 0x112f6f350>>
问题是在Web浏览器中以包含必须正常呈现的HTML的字符串呈现此内容。浏览器显然被尖括号弄糊涂了。
我很难找到关于如何形成这些表示的任何信息,如果有一个名称甚至。
是否可以通过覆盖__repr__
来改变Python将对象表示为字符串的方式,对于所有未定义__repr__
方法的对象, object
上课?
所以,如果Python通常会返回"<Foo object at 0x112f6f350>"
,那么什么钩子可以使它返回"{Foo object at {0x112f6f350}}"
或其他任何东西,而不必直接修改Foo
和其他所有类? / p>
答案 0 :(得分:7)
您可以使用__builtin__
s(在导入任何内容之前)。我发现替换__builtin__.repr
使不有效,但替换__builtin__.object
会有效。
以下是如何做到的。假设您有一个定义类的模块:
# foo.py
class Foo(object):
pass
在 main 脚本中,执行:
# main.py
import __builtin__
class newobject(object):
def __repr__(self):
return '{%s object at {%s}}' % (self.__class__.__name__, hex(id(self)))
__builtin__.object = newobject
from foo import Foo
foo = Foo()
print '%r' % foo
打印:
{Foo object at {0x100400010}}
注意您已将bound method
作为您想要处理的示例,但绑定的方法做已定义__repr__
,因此我猜你不要我真的想要一个影响他们的解决方案。 (查看object().__repr__.__repr__
)
答案 1 :(得分:2)
他们不是我的对象。它适用于shell,因此用户可以打印任何他们喜欢的东西。如果他们在基于浏览器的客户端中打印3个Foo的列表,则他们不应该获得三个损坏的[不可见] HTML元素的列表。我正在尝试调整Python,以便在调整之后表示的所有对象都以不同的方式呈现为默认值。
在这种情况下,您可以更改sys.displayhook()
:
import sys
from cgi import escape
try:
import __builtin__ as builtins
except ImportError: # Python 3
import builtins
def html_displayhook(value):
if value is None:
return
text = escape(repr(value)) # <-- make html-safe text
sys.stdout.write(text)
sys.stdout.write("\n")
builtins._ = value
sys.displayhook = html_displayhook
默认打印html安全对象表示,如果他们喜欢,则不会阻止用户打印原始html。