首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >编写repr方法

编写repr方法
EN

Stack Overflow用户
提问于 2016-06-13 05:09:25
回答 1查看 5.5K关注 0票数 5

情境:我是python的新手,目前正在尝试学习技巧,我已经尝试创建一个链表类来帮助更好地理解这门语言及其结构。我知道__repr__函数基本上应该返回与__str__相同的东西,但我不确定实际的区别是什么。

到目前为止,这是我的类:

代码语言:javascript
复制
class LinkedList:
    class Node:
        def __init__(self, val, prior=None, next=None):
            self.val = val
            self.prior = prior
            self.next  = next

    def __init__(self):
        self.head = LinkedList.Node(None) 
        self.head.prior = self.head.next = self.head 
        self.length = 0

    def __str__(self):
        """Implements `str(self)`. Returns '[]' if the list is empty, else
        returns `str(x)` for all values `x` in this list, separated by commas
        and enclosed by square brackets. E.g., for a list containing values
        1, 2 and 3, returns '[1, 2, 3]'."""
        if len(self)==0:
            return '[]'
        else:
            return '[' +  ', '.join(str(x) for x in self) + ']'

    def __repr__(self):
        """Supports REPL inspection. (Same behavior as `str`.)"""
        return '[' +  ', '.join(str(x) for x in self) + ']'

当我用下面的代码测试这段代码时,我会得到一个错误,说在使用repr函数时实际上没有返回空字符串'[]‘。我如何编辑这个方法体来解决这个问题?我也尝试过return str(self),我也不确定为什么它不能工作。

代码语言:javascript
复制
from unittest import TestCase
tc = TestCase()

lst = LinkedList()
tc.assertEqual('[]', str(lst))
tc.assertEqual('[]', repr(lst))

lst.append(1)
tc.assertEqual('[1]', str(lst))
tc.assertEqual('[1]', repr(lst))
EN

回答 1

Stack Overflow用户

发布于 2016-06-13 05:15:38

__repr__函数返回Python对象的字符串表示形式,Python解释器可以对其求值以实例化该对象的另一个实例。所以如果你有一份清单:

代码语言:javascript
复制
x = ['foo', 'bar']

它的__repr__字符串将是:

代码语言:javascript
复制
x_str = repr(x)
print(x_str)
>>>>
"['foo', 'bar']"

你可以这样做:

代码语言:javascript
复制
x2 = eval(x_str)
print(type(x2))
>>>>
<class 'list'>

这是一种获取Python对象的字符串表示形式的方法,可以将其转换回所述对象的新实例。

基本上,Python和__repr__之间的区别在于,前者返回供人读取的对象的字符串表示,而后者返回供Python解释器解析的对象的字符串表示。对此要非常小心!

在您的示例代码中,__str____repr__似乎返回相同的字符串表示。这很好。但是,如果您愿意,可以让__str__返回一些更漂亮的格式化版本(例如,带回车符和无方括号),但是__repr__应该始终返回一个字符串,该字符串可以被Python解释器解析以重新构造对象。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37779105

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档