Почему в Python константы ведут себя по-разному: странные особенности True, False, None и других
Python's pre-declared constants are kinda weird
В Python есть шесть предопределённых констант: True, False, None, __debug__, Ellipsis (или ...) и NotImplemented. Они ведут себя по-разному: True, False и None — ключевые слова, __debug__ — единственный идентификатор, который нельзя присвоить, а Ellipsis и NotImplemented — обычные встроенные имена, которые можно переопределить. Автор разбирает эти различия, включая возможность изменить значения через setattr(builtins, ...), и показывает, что SyntaxError иногда возникает не из-за синтаксиса, а из-за особых случаев.
Так что в некотором смысле ... — настоящая константа, а Ellipsis — нет. Странно, правда?
- Revanche1367
Многие решения в дизайне Python казались мне странными и неправильными, но долгое время это оправдывали тем, что именно эти маленькие уродливые дизайнерские решения делают язык настолько удобным и эффективным на практике по сравнению с более хорошо спроектированными языками, которые почти никто не использует. Я недостаточно эксперт, чтобы чётко сказать, правда ли это, но, на мой взгляд, существует повторяющаяся закономерность: языки с немного странным дизайном становятся суперпопулярными: Python, JavaScript, возможно, C тоже. Или, может быть, мы замечаем странность только потому, что эти языки так широко используются и их дотошно критикуют без конца.
- jherskovic
У Python есть просто потрясающие библиотеки, даже без C. Есть Django для тех из нас, кто любит разрабатывать веб-приложения, но так и не смог полюбить Ruby on Rails. И Django изумителен. Я также ещё не видел лучшего языка для быстрого написания ETL-скриптов и конвейеров. А также для «мне нужен скрипт для $SYSADMIN_TASK, но я хочу иметь возможность прочитать его позже». Всё, что определяется внешними задержками (веб, базы данных и т.д.), будет достаточно быстрым для многих применений в Python. Конечно, это не язык для написания веб-браузера или игрового движка. И он медленный. Но у него есть очень сильные ниши помимо ML/науки о данных. Лично я его люблю. Каждому своё.
- zahlman
Прошлое: https://news.ycombinator.com/item?id=49284392 (с моим комментарием), https://news.ycombinator.com/item?id=49250370 . Приятно видеть, что на этот раз он получил внимание.
- nneonneo
Константа __debug__ действительно странная — любой блок кода, защищённый `if __debug__:`, будет полностью исключён из байткода при PYTHONOPTIMIZE=1. Это и `assert` — единственные два примера настоящей «условной компиляции» в Python. Это также причина, по которой нельзя присваивать значение __debug__: это сделало бы возможным аннулировать предположение компилятора об операторах `if __debug__:`.
- neillyons
Я помню, читал, что в ранних версиях Python не было встроенных True и False. Каждый пользователь реализовывал их сам как
True = 1
False = 0
затем они были добавлены в язык. В Python 2 их всё ещё можно было переназначать и менять местами, так что 'if False' на самом деле было истинным!
True, False = False, True
В Python 3 их больше нельзя переназначать.
- gucci-on-fleek
Если считать предрелизные версии, на самом деле есть 7 предварительно объявленных констант, поскольку Python 3.15 (планируется к выпуску в ноябре [0]) добавляет новую константу "TYPE_CHECKING", которая должна вести себя так же, как "Ellipsis" и "NotImplemented" сейчас [1].
[0]: https://peps.python.org/pep-0790/#schedule
[1]: https://peps.python.org/pep-0781/#backwards-compatibility
- hmokiguess
Python ужасен. В библиотеках так много исключений, ни одна не придерживается единого стиля, он медленный, и слишком легко сделать что-то неправильно. Я часто работаю с дата-сайентистами и вынужден доводить их jupyter-ноутбуки до продакшена — это чистый ад неоптимальности. Наверное, у него хорошая лёгкая кривая обучения для исследований/черновиков.
- YuechenLi
Python — просто такой странный язык в целом, несмотря на его популярность, что я честно не могу рекомендовать тем, кто начинает программировать, выбирать Python как первый язык, вопреки распространённому мнению. Я имею в виду, я был одним из первых, кто начал использовать Python в аспирантуре почти десять лет назад, когда все остальные в моей области всё ещё использовали Matlab для лабораторного кода, по той простой причине, что Numpy был менее ужасен, чем Matlab, и мне нужно было что-то, что легко печатает графики в PDF. Единственное хорошее, что я могу сказать о Python сегодня, — это то, что легко начать на первые пять минут, а потом придётся иметь дело со всей его странностью: значимые пробелы, истинность, утиная типизация, GIL, распространение/упаковка и т.д., и т.п. Я долгое время был большим поклонником Julia как потенциальной замены Python для науки и много её пропагандировал, но в последнее время я всё больше убеждаюсь, что JIT/множественная диспетчеризация хороши только если вы уже умеете хорошо программировать, а для многих учёных, не работающих в компьютерных науках, они пишут довольно ужасный код. Я думаю, возможно, лучше вообще пропустить Python и сразу писать код на статически типизированном языке.