情况:
我是python的新手,目前正在尝试学习绳索,我尝试创建一个链表类,以帮助更好地理解语言及其结构。我知道__repr__
函数基本上应该返回与__str__
相同的东西,但我不确定实际差异是什么。
到目前为止,这是我的班级:
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)
,我也不确定为什么它也不起作用。
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))
答案 0 :(得分:4)
__repr__
函数返回Python对象的字符串表示形式,Python解释器可以对其进行评估,以实例化该对象的另一个实例。所以如果你有一个清单:
x = ['foo', 'bar']
其__repr__
字符串为:
x_str = repr(x)
print(x_str)
>>>>
"['foo', 'bar']"
你可以这样做:
x2 = eval(x_str)
print(type(x2))
>>>>
<class 'list'>
这是获取Python对象的字符串表示形式的一种方法,可以将其转换回所述对象的新实例。
基本上__str__
和__repr__
之间的区别在于前者返回一个人的目标读取对象的字符串表示形式,后者返回要解析的对象的字符串表示形式由Python解释器。对此非常小心!
在您的示例代码中,似乎__str__
和__repr__
返回相同的字符串表示形式。没关系。但是,如果您愿意,可以让__str__
返回一些更漂亮的格式化版本(例如使用回车符和无括号),但__repr__
应始终返回可由Python解释器解析的字符串重建对象。