如何理解和解析默认的Python对象表示

时间:2013-11-03 16:03:57

标签: python built-in repr

当您在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>

2 个答案:

答案 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。