РЕДАКТИРОВАТЬ: может быть, это просто упущение, которое не было решено? Документация стандартных типов включает .copy()
и .clear()
в таблицу методов для типов изменяемых последовательностей .
Сегодня утром я заметил кое-что любопытное: объект list
в Python> 3.3 включает метод .copy()
, а также метод .clear()
. Однако абстрактные базовые классы collections.abc
Sequence
и MutableSequence
не включают эти методы являются частью их спецификации (конечно, .clear()
будет иметь смысл только как часть спецификации MS).
>>> x = [1,2,3]
>>> x.copy()
[1, 2, 3]
>>> x.clear()
>>> x
[]
Насколько я понимаю, одна из причин использования MutableSequence
- это для сигнализации вселенной вы хотите, чтобы ваш объект "действовал как list
" (если явно указано иное):
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 не может быть скопирован (и MS не может быть очищен), как list
:
>>> s = S()
>>> s.copy()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'S' object has no attribute 'copy'
Это кажется странным, и, как и для большинства подобных вещей, вероятно, есть веская причина для этого. Что это?