4

当您在 Python 中打印一个对象__repr__并且__str__不是由用户定义时,Python 会将对象转换为字符串表示形式,并用尖括号分隔...

<bound method Shell.clear of <Shell object at 0x112f6f350>>

问题是在 Web 浏览器中以字符串形式呈现它,这些字符串还包含必须正常呈现的 HTML。浏览器显然被尖括号弄糊涂了。

我正在努力寻找有关这些表示如何形成的任何信息,即使它们有名称。

对于所有没有__repr__定义方法的对象,是否可以通过重写__repr__类来改变 Python 将对象表示为字符串的方式object

那么,如果 Python 通常会 return "<Foo object at 0x112f6f350>",那么什么钩子可以让它返回"{Foo object at {0x112f6f350}}",或者其他什么,而不必直接修改Foo和其他所有类?

4

2 回答 2

7

您可以使用__builtin__s (在导入任何内容之前)。我发现替换__builtin__.repr不起作用,但替换可以__builtin__.object

这是如何做到的。假设您有一个定义类的模块:

# foo.py
class Foo(object):
    pass

在您的脚本中,执行以下操作:

# 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__

于 2013-12-29T19:16:12.640 回答
2

他们不是我的对象。这是一个外壳,所以用户将能够打印他们喜欢的任何东西。如果他们在基于浏览器的客户端中打印 3 个 Foos 的列表,他们不应该得到三个损坏的 [不可见] 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(如果他们喜欢它)。

于 2014-01-03T16:08:37.687 回答