Pythonの「定数」は6つあるが、挙動がバラバラで奇妙だ

Python's pre-declared constants are kinda weird

PythonにはTrue、False、None、__debug__、Ellipsis(...)、NotImplementedという6つの「定数」が定義されているが、それぞれの扱いが微妙に異なる。True、False、Noneはキーワードであり、識別子として扱われないため、x.TrueはSyntaxErrorになる。__debug__は通常の識別子だが代入が禁止されており、特殊なエラーメッセージが用意されている。一方、EllipsisとNotImplementedは単なる組み込み関数であり、グローバルで上書き可能だ。さらに、TrueやFalseもbuiltinsモジュールの属性として存在し、setattrで変更できるが、その値は反映されない。この記事では、これらの定数の奇妙な挙動と、その背後にある設計上の疑問を探る。

EllipsisとNotImplementedは、他の4つの定数とは異なり、実際には「定数」ではない。単なる通常の組み込み関数であり、グローバルで影にすることができる。
  1. Revanche1367

    Pythonの設計上の決定には、私にとって奇妙で違和感を感じるものがたくさんある。しかし、彼らは長い間、実用性と効果を重視した結果、ほとんど誰も使わないような、よりよく設計された言語と比較して、Pythonを実用的で効果的な言語にしているのは、そういった小さな醜い設計上の選択なのだと正当化してきた。私自身は、それが本当に正しいかどうかを明確に言えるほどの専門家ではないが、個人的には、少し奇妙に設計された言語が非常に人気になるというパターンが繰り返されているように思う。Python、JavaScript、おそらくCもそうだ。あるいは、これらの言語が非常に多く使われ、徹底的にあら探しをされるからこそ、その奇妙さに気づくのかもしれない。

  2. jherskovic

    Pythonには、Cを使わなくても絶対に素晴らしいライブラリがいくつかある。Webアプリの開発が好きだけどRuby on Railsにどうしても魅力を感じられないという人には、Djangoがある。そしてDjangoは素晴らしい。また、簡単なETLスクリプトやパイプラインを書くのに、これ以上の言語を見たことがない。さらに、『システム管理タスク用のスクリプトが必要だが、後で読み返せるようにしたい』という場合にも最適だ。外部レイテンシ(Web、データベースなど)に支配されるものはすべて、Pythonで多くの用途に十分な速度で動作する。もちろん、Webブラウザやゲームエンジンを書くための言語ではないし、遅い。しかし、MLやデータサイエンス以外にも非常に強いニッチがある。個人的には、私はPythonが大好きだ。それぞれに好みがあるだろう。

  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における真の「条件付きコンパイル」の唯一の2つの例である。これが、__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(11月リリース予定[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を選ぶことを正直お勧めできない。というのも、私は約10年前に大学院にいたとき、私の分野の他の誰もがまだ研究室のコードにMatlabを使っていたときに、Pythonを使い始めた最初の一人だった。その理由は単純に、NumPyがMatlabよりはましで、グラフをPDFに簡単に出力できるものが欲しかったからだ。

    今日のPythonについて良いと言える唯一のことは、最初の5分間は始めやすいということだ。その後、あなたはその奇妙さのすべてに対処しなければならない:有意な空白、真偽値、ダックタイピング、GIL、配布/パッケージング、などなど。

    私は長い間、科学分野でのPythonの置き換え候補としてJuliaを大いに支持し、以前は熱心に宣伝していた。しかし最近では、JIT/多重ディスパッチは、そもそもプログラミングをよく知っている人にとってのみ有効であり、コンピュータサイエンスを専門としない多くの学者にとっては、かなりひどいコードを書くことをますます確信するようになった。Pythonを完全に飛ばして、最初から静的に型付けされた言語でコードを書く方が良いかもしれないと思う。

この日のほかの記事

2026-08-25