Почему в 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 — нет. Странно, правда?
  1. Revanche1367

    Многие решения в дизайне Python казались мне странными и неправильными, но долгое время это оправдывали тем, что именно эти маленькие уродливые дизайнерские решения делают язык настолько удобным и эффективным на практике по сравнению с более хорошо спроектированными языками, которые почти никто не использует. Я недостаточно эксперт, чтобы чётко сказать, правда ли это, но, на мой взгляд, существует повторяющаяся закономерность: языки с немного странным дизайном становятся суперпопулярными: Python, JavaScript, возможно, C тоже. Или, может быть, мы замечаем странность только потому, что эти языки так широко используются и их дотошно критикуют без конца.

  2. jherskovic

    У Python есть просто потрясающие библиотеки, даже без C. Есть Django для тех из нас, кто любит разрабатывать веб-приложения, но так и не смог полюбить Ruby on Rails. И Django изумителен. Я также ещё не видел лучшего языка для быстрого написания ETL-скриптов и конвейеров. А также для «мне нужен скрипт для $SYSADMIN_TASK, но я хочу иметь возможность прочитать его позже». Всё, что определяется внешними задержками (веб, базы данных и т.д.), будет достаточно быстрым для многих применений в Python. Конечно, это не язык для написания веб-браузера или игрового движка. И он медленный. Но у него есть очень сильные ниши помимо ML/науки о данных. Лично я его люблю. Каждому своё.

  3. zahlman

    Прошлое: https://news.ycombinator.com/item?id=49284392 (с моим комментарием), https://news.ycombinator.com/item?id=49250370 . Приятно видеть, что на этот раз он получил внимание.

  4. nneonneo

    Константа __debug__ действительно странная — любой блок кода, защищённый `if __debug__:`, будет полностью исключён из байткода при PYTHONOPTIMIZE=1. Это и `assert` — единственные два примера настоящей «условной компиляции» в Python. Это также причина, по которой нельзя присваивать значение __debug__: это сделало бы возможным аннулировать предположение компилятора об операторах `if __debug__:`.

  5. neillyons

    Я помню, читал, что в ранних версиях Python не было встроенных True и False. Каждый пользователь реализовывал их сам как

    True = 1

    False = 0

    затем они были добавлены в язык. В Python 2 их всё ещё можно было переназначать и менять местами, так что 'if False' на самом деле было истинным!

    True, False = False, True

    В Python 3 их больше нельзя переназначать.

  6. 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

  7. hmokiguess

    Python ужасен. В библиотеках так много исключений, ни одна не придерживается единого стиля, он медленный, и слишком легко сделать что-то неправильно. Я часто работаю с дата-сайентистами и вынужден доводить их jupyter-ноутбуки до продакшена — это чистый ад неоптимальности. Наверное, у него хорошая лёгкая кривая обучения для исследований/черновиков.

  8. YuechenLi

    Python — просто такой странный язык в целом, несмотря на его популярность, что я честно не могу рекомендовать тем, кто начинает программировать, выбирать Python как первый язык, вопреки распространённому мнению. Я имею в виду, я был одним из первых, кто начал использовать Python в аспирантуре почти десять лет назад, когда все остальные в моей области всё ещё использовали Matlab для лабораторного кода, по той простой причине, что Numpy был менее ужасен, чем Matlab, и мне нужно было что-то, что легко печатает графики в PDF. Единственное хорошее, что я могу сказать о Python сегодня, — это то, что легко начать на первые пять минут, а потом придётся иметь дело со всей его странностью: значимые пробелы, истинность, утиная типизация, GIL, распространение/упаковка и т.д., и т.п. Я долгое время был большим поклонником Julia как потенциальной замены Python для науки и много её пропагандировал, но в последнее время я всё больше убеждаюсь, что JIT/множественная диспетчеризация хороши только если вы уже умеете хорошо программировать, а для многих учёных, не работающих в компьютерных науках, они пишут довольно ужасный код. Я думаю, возможно, лучше вообще пропустить Python и сразу писать код на статически типизированном языке.

Ещё за этот день

2026-08-25