Почему min и max указаны как операции последовательности?

#python

#python

Вопрос:

В документации Python есть таблица с «Общими операциями последовательности«, которые «поддерживаются большинством типов последовательностей». В нем перечислены, например x in s , s[i] , и len(s) , которые последовательность может поддерживать с помощью методов __contains__ , __getitem__ и __len__ . Но в нем также перечислены min(s) и max(s) , и я не понимаю, почему. Эти два работают с любой итерацией, я не вижу в них ничего особенного по отношению к последовательностям. Нет __min__ и __max__ или каких-либо других способов их реальной поддержки, не так ли? И если бы они были, я бы ожидал max(range(10**8)) , что результат выдаст мне мгновенно, а не займет несколько секунд. Точно так 10**20 in range(10**30) же, как и. И если min и max существуют только для демонстрации встроенных функций, я бы предпочел ожидать reversed , что они будут перечислены, поскольку это действительно имеет какое-то отношение к последовательностям (это работает для каждой последовательности, но не для каждой итерации).

Итак, я что-то упускаю из виду? Или __min__ и __max__ или какой-либо другой способ действительно поддерживался min и max существовал в предыдущих версиях Python, и таблица не обновлялась? Или есть какая-то другая веская причина перечислить их там? Я в замешательстве.

В первом абзаце этого раздела даже говорится:

collections.abc.Sequence ABC предоставляется для упрощения правильной реализации этих операций с пользовательскими типами последовательностей.

Похоже, что люди, пишущие пользовательские типы последовательностей, каким-то образом должны их реализовывать. Для меня это не имеет смысла, если нет реального способа их реализации.

Комментарии:

1. I'd expect max(range(10**8)) to give me the result instantly это будет для xrange , верно?

2. @RandomDavis Нет, в том-то и дело.

3. Похоже, это ошибка в документации. Я проверил bltinmodule.c , определено место, где min_max определено: оно безоговорочно повторяет аргумент.

4. @L3viathan Хорошая идея. Я тоже посмотрел сейчас, как в master , так и в теге, соответствующем текущей документации. Ничего особенного в отношении последовательностей ни в том, ни в другом, просто создает итератор и использует его.

5. @Wups Хм, я думаю, что документация Python довольно хороша. И я не уверен __min__ , что / __max__ support того стоит. range это единственный встроенный тип, который я могу придумать, где он может очень помочь, и я не думаю, что у меня когда-либо возникало желание использовать min or max на a range :-). Случай, скажем __contains__ , отличается, поскольку это, конечно, важно для set / dict . Но я думаю range , что это единственный встроенный тип, который, естественно , может поддерживать min / max . (Некоторые пользовательские или сторонние типы, такие как sortedcontainers, также могут.)

Ответ №1:

Похоже на ошибку документации, первоначальный коммит для этого был сделан в 1998 году. Вероятно, идея заключалась в том, чтобы перечислить все операции, которые пользователь может выполнять с последовательностями, не обязательно переопределять их.

reversed с другой стороны, был добавлен в 2003 году.

Когда The collections.abc.Sequence ABC is provided to make it easier to correctly implement these operations on custom sequence types часть была добавлена, либо функции min / max должны были быть удалены из таблицы, чтобы предотвратить такую путаницу (поскольку пока нет доступных методов dunder для переопределения поведения этих двух встроенных функций), либо формулировка должна была быть улучшена.