__repr__和eval()之间的关系是什么,__repr__的主要目的是什么



我刚刚遇到了这个问题,Python中__str____repr__的区别,它提到__repr__的主要目的是明确的。但是我听说__repr__的主要目的是生成一个字符串,以便 eval() 可以稍后重建python对象。实际上__repr__的主要目的是什么?是否有任何内置函数或python中的任何默认模块固有地使用__repr__来重建对象?如果我们只是重写__repr__,使其返回一个常量字符串(例如:"foo")总是?

对于具有文字符号的类型(str, int, float, list等),repr()返回一个字符串,可用于再次创建该类型。

很好,但不是必需的。

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

引用__repr__文档:

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

但最重要的是:

这通常用于调试,因此重要的是表示是信息丰富且明确的。

我特别强调。

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

约定是使用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)>'

最新更新