#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
ormax
на arange
:-). Случай, скажем__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 для переопределения поведения этих двух встроенных функций), либо формулировка должна была быть улучшена.