python中__repr__的主要目的

时间:2013-03-27 14:13:32

标签: python python-3.x

我刚刚遇到了这个问题Difference between __str__ and __repr__ in Python,并提到__repr__的主要目的是明确无误。但我听说__repr__的主要目的是生成一个字符串,以便 eval() 可以在以后重建python对象。实际上__repr__的主要目的是什么? python中的任何内置函数或任何默认模块本身都使用__repr__来重构对象吗?如果我们只是覆盖__repr__使得它总是返回一个常量字符串(例如“foo”),它会搞砸执行吗?

2 个答案:

答案 0 :(得分:8)

对于具有文字符号(strintfloatlist等)的类型,repr()会返回一个字符串,可以是用于再次创建类型。

那是很好,但不是必需品。

__repr__的主要目的是为开发人员提供有关他们在这里有什么对象的明确信息,以便进行调试。

引用__repr__ documentation

  

repr()内置函数调用以计算对象的“官方”字符串表示形式。如果可能的话,这应该看起来像一个有效的Python表达式,可用于重新创建具有相同值的对象(给定适当的环境)。如果无法做到这一点,则应返回<...some useful description...>形式的字符串。

但最重要的是:

  

这通常用于调试,因此表示信息丰富且明确无误。

强调我的。

从您的自定义类型中返回一个常量字符串不会在技术上破坏任何内容,但会使您作为开发人员的生活更难

答案 1 :(得分:0)

惯例是您使用repr来获取表示对象的字符串,并使用str来描述它。 repr更多用于调试,str用于常规打印。我们的想法是,repr的输出看起来像你可以评估的代码,通常是。但是,你不能依赖它。如果您必须将对象转换为字符串并返回,请使用picklejson

例如:

>>> greeting = "Hello"
>>> print str(greeting)
Hello

>>> print repr(greeting)
'Hello'

如果您正在编写自己的类,并且它非常简单,您可以使__repr__返回可以评估的内容:

class Song(object):
    def __init__(self, title, artist):
        self.title = title
        self.artist = artist

    def __repr__(self):
        return "Song(%r, %r)" % (self.title, self.artist)

    def __str__(self):
        return "%s - %s" % (self.artist, self.title)

请注意我如何使用%r获取标题和艺术家的repr。这会自动转义和引用(对于python),并允许我评估repr(a_song)的结果,尽管我不会在调试之外这样做。同样,str会向用户返回一些内容,repr可帮助您调试的内容。如果课程比这更复杂,您将无法从repr返回完整或可撤销的内容。这里的约定是返回一个简洁的字符串来标识您的实例,通常使用尖括号:

>>> repr(type(None))
"<type 'NoneType'>"

>>> import gtk
>>> win = gtk.Window()
>>> repr(win)
'<gtk.Window object at 0x10de45690 (GtkWindow at 0x7fdd89240000)>'