【问题标题】:right usage of __repr__() in python?__repr__() 在 python 中的正确用法?
【发布时间】:2012-06-14 00:07:46
【问题描述】:

我有一个容器类,我想用它来打印其中的所有元素。

我想将它们打印到文件或控制台。

我已经布置了元素 (Patch) 和容器类,如下所示和 __repr__(self)
我不确定我是否理解__repr__() 的目的,并且想知道这里的用法是否可以。

class Patch:
    def __init__(self, folder_name, file_name):
        self.folder_name = folder_name
        self.file_name = file_name
        self.full_path = os.path.join(self.folder_name, self.file_name)
        self.file_hash = md5_for_file(open(self.full_path, 'r'))
        self.file_size = os.path.getsize(self.full_path)

    def __repr__(self):
        return "%s %s %s" % (self.file_name, self.file_hash, self.file_size)

class PatchContainer:
    def __init__(self):
        self.patch_folder_dict = collections.OrderedDict()
        self.patch_file_set = set()
    def addPatch(self, patch):
        if patch.file_name in self.patch_file_set:
            print '*** Delete the file ', patch.full_path, ' ***'
            return
        self.patch_file_set.add(patch.file_name)
        if not patch.folder_name in self.patch_folder_dict:
            self.patch_folder_dict[patch.folder_name] = [patch]
        else:
            self.patch_folder_dict[patch.folder_name].append(patch)

    def prettyPrint(self, writeable_object=PATCH_META_FILE):
        sys.stdout = writeable_object
        for patch_folder in self.patch_folder_dict.keys():
            print patch_folder
            patch_list = self.patch_folder_dict[patch_folder]
            for patch in patch_list:
                print patch
        sys.stdout = sys.__stdout__

它按预期工作,但请评论样式/用法是否正常。

【问题讨论】:

    标签: python file repr


    【解决方案1】:

    这看起来你可能想要__str__。它们相似,但__str__ 返回供人类消费的东西; __repr__ 应该返回一些供 Python 使用的东西——它应该是一个 Python 表达式,它将评估为一个相等的对象,或者是尖括号中的东西,比如默认的 <classname object at id>。请参阅 documentation 以获取内置 repr(object),它最终会调用 object.__repr__()

    对于许多类型,此函数会尝试返回一个字符串 当传递给 eval() 时会产生一个具有相同值的对象, 否则表示是用尖括号括起来的字符串 包含对象类型的名称以及 补充资料

    【讨论】:

    • Raymond Hettinger (@raymondh) 前几天在推特上发布了关于该主题的推文:“如果可能,__repr__ 方法应显示对象的构造方式。不变量应为:eval(repr(obj)) == obj。”跨度>
    • prettyPrint() 函数怎么样?我可以定义 PatchContainer 的 str() 而不是 prettyPrint。
    • @Eugene 是的。这样做可能更有意义,因此不要调用patchcontainer.prettyprint(file),而是调用print >>file patchcontainer(或者print(patchcontainer, file=file),如果你调用from __future__ import print_function)。将业务级类与执行 IO 的代码分开几乎总是一个好主意。
    【解决方案2】:

    这是对象的人类可读表示。

    • “Python 的__repr__ 的用途”:clicky
    • “Python 中__str____repr__ 之间的区别”:clicky
    • Python 文档:clicky

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-11-04
      • 2020-02-20
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 2023-01-05
      • 2016-08-15
      • 2011-12-07
      相关资源
      最近更新 更多