gpt4 book ai didi

python - 编写一个 repr 方法

转载 作者:太空狗 更新时间:2023-10-30 02:42:01 26 4
gpt4 key购买 nike

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

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

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))

最佳答案

__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 解释器解析以重建对象。

关于python - 编写一个 repr 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37779105/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com