Почему методы .copy и .clear не входят в спецификации базовых классов для абстрактных последовательностей? - PullRequest
0 голосов
/ 02 июля 2018

РЕДАКТИРОВАТЬ: может быть, это просто упущение, которое не было решено? Документация стандартных типов включает .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'

Это кажется странным, и, как и для большинства подобных вещей, вероятно, есть веская причина для этого. Что это?

1 Ответ

0 голосов
/ 02 июля 2018

Нашел ответ - по крайней мере, относительно copy() - после публикации вопроса: кажется, этот вопрос обсуждался довольно давно в багтрекере. Пара цитат:

Я не думаю, что это необходимо, и при этом я не думаю, что это хорошая идея есть метод copy () в азбуке, потому что они так мало знают о их конкретный базовый класс (возможно, резервный магазин в файловая система или база данных).

и

Тип возврата copy () для ABC кажется проблематичным. MutableMapping его тоже нет.

Как я и ожидал, это обсуждалось, и, похоже, за этим стоят веские причины.

Этот маленький кусочек от GVR также стоит включить:

Я лично презираю почти все виды использования "копирования" (включая весь модуль копирования, как функции глубокого, так и мелкого копирования).

...