Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 为什么.copy和.clear方法不是序列抽象基类规范的一部分?_Python_Python 3.x_Abc - Fatal编程技术网

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'