Python 为什么.copy和.clear方法不是序列抽象基类规范的一部分?
编辑:这是否只是一个尚未解决的疏忽?标准类型文档包括中的Python 为什么.copy和.clear方法不是序列抽象基类规范的一部分?,python,python-3.x,abc,Python,Python 3.x,Abc,编辑:这是否只是一个尚未解决的疏忽?标准类型文档包括中的.copy()和.clear() 今天早上我注意到一些奇怪的事情:Python>3.3中的list对象包括一个.copy()方法,还有一个.clear()方法。但是,collections.abcSequence和MutableSequence抽象基类是其规范的一部分(.clear()当然只能作为MS规范的一部分) 我的理解是,使用MutableSequence的部分原因是您(除非另有明确说明): 但是,完全定义的S类型不能像列表那样被复制
.copy()
和.clear()
今天早上我注意到一些奇怪的事情:Python>3.3中的list
对象包括一个.copy()
方法,还有一个.clear()
方法。但是,collections.abc
Sequence
和MutableSequence
抽象基类是其规范的一部分(.clear()
当然只能作为MS规范的一部分)
我的理解是,使用MutableSequence
的部分原因是您(除非另有明确说明):
但是,完全定义的S类型不能像列表那样被复制(MS也不能被清除):
>>> s = S()
>>> s.copy()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'S' object has no attribute 'copy'
>s=s()
>>>美国文案()
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
AttributeError:'S'对象没有属性'copy'
这看起来很奇怪,就像大多数这样的事情一样,可能有一个很好的理由。这是什么?在发布问题后找到了答案——至少是关于copy()
——这似乎是很久以前在bug追踪器中发现的问题。几句话:
我不认为这是必要的,也不认为这是一个好主意
在ABC中有一个copy()方法,因为他们对
它们的具体底层类(可能是
文件系统或数据库)
以及:
ABCs的copy()返回类型感觉有问题。可变映射
也没有
正如我所预料的那样,这一点已经被讨论过了,而且背后似乎有合理的理由
GVR的这则小新闻还值得包括:
我个人鄙视“复制”的几乎所有用途(包括
整个复制模块,包括深度和浅层复制功能)
那个讨论不是关于列表/可变序列:它的标题是“collections.*abc.Set**不提供copy()方法”(强调我的)。@martineau是的,但如果你读了讨论,他们也谈论序列。@martineau或我应该说:它变成了关于所有abc的一般性讨论,至少是关于copy()
。没有解释为什么clear()
被忽略。不管为什么,你不能用所需的方法派生甚至创建自己的ABC吗?显然这不是疏忽。你提到Guido讨论结束时添加的“花絮”是你将得到的所有答案(因为他是结束问题的人):状态:结束,决议:拒绝。
from typing import Sequence
class S(Sequence):
x = [1, 2, 3]
def __getitem__(self, item):
return self.x[item]
def __len__(self):
return len(self.x)
>>> s = S()
>>> s.copy()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'S' object has no attribute 'copy'