gpt4 book ai didi

python - 在 set 的子类上调用 super().__repr__() 时出现意外行为?

转载 作者:行者123 更新时间:2023-12-04 07:38:11 25 4
gpt4 key购买 nike

有关此行为的解释(在 CPython 中),请参阅下面的编辑
在 Python 3.9.5 中,我创建了两种自定义集合类型,一种继承自 list另一个来自 set .我希望他们有定制 __repr__方法。简单的例子:

class MyList(list):

def __repr__(self) -> str:
return f'MyList({super().__repr__()})'


class MySet(set):

def __repr__(self) -> str:
return f'MySet({super().__repr__()})'

请注意 __repr__()除了初始字符串前缀外,定义是相同的。但是当我打印它们时,我得到了不同的结果:
ml = MyList('abc')
print(ml) # MyList(['a', 'b', 'c'])

ms = MySet('abc')
print(ms) # MySet(MySet({'c', 'a', 'b'}))
MyList的显示是我所期望的。但不知为何 MySet打印了两次,就像 __repr__正在被递归调用或其他什么。有谁知道发生了什么,或者如何最好地让它显示 MySet({'c', 'a', 'b'}) , 而不是 MySet(MySet({'c', 'a', 'b'})) ?
[编辑]
从 3.9.5 开始,在 https://github.com/python/cpython/blob/main/Objects/setobject.c功能 set_repr有代码:
    if (!PySet_CheckExact(so))
result = PyUnicode_FromFormat("%s({%U})",
Py_TYPE(so)->tp_name,
listrepr);
else
result = PyUnicode_FromFormat("{%U}", listrepr);
换句话说, set是硬编码的,所以它的 __repr__如果类型恰好是 set,则省略类名并且该集合非空,但否则显示类名。但是 dictlist不要这样做,出于某种原因。

最佳答案

那是 set 的默认打印,它打印类名。如果删除 format你添加了它完全如你所愿。

class MySet(set):

def __repr__(self) -> str:
return super().__repr__()

if __name__ == '__main__':

ms = MySet('abc')
print(ms)
MySet.__name__ = 'New_name'
print(ms)
输出:
MySet({'b', 'c', 'a'})
New_name({'b', 'c', 'a'})

关于python - 在 set 的子类上调用 super().__repr__() 时出现意外行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67640558/

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