web-dev-qa-db-ja.com

Pythonにconstがないのはなぜですか?

私はC出身で、Pythonを学んでいます。明示的なタイプセーフの欠如は厄介ですが、慣れてきました。組み込みのコントラクトベースのプログラミング(純粋な抽象クラス、インターフェース)がないことは、動的言語のすべての利点に直面して、慣れるためのものです。

しかし、const-cortectnessを要求できないことは私を夢中にさせています! Pythonに定数がないのはなぜですか? クラスレベルの定数 が推奨されないのはなぜですか?

39
Vorac

CおよびPythonは、2つの異なるクラスの言語に属しています。

前者は静的に型付けされます。後者はdynamicです。

静的に型付けされた言語では、型チェッカーは各式の型を推測し、これが「コンパイル」フェーズ中に指定された宣言と一致するかどうかを確認できます。

動的に型付けされた言語では、必要な型情報は実行時まで利用できません。また、式のタイプは実行ごとに異なる場合があります。もちろん、プログラムの実行中に型チェックを追加することもできます。これはPythonで行われた選択ではありません。これは、「ダックタイピング」を可能にする利点があります。欠点は、インタプリタが型の正しさをチェックできないことです。

constキーワードについて。これはタイプ修飾子です。変数の許可された使用の制限(および許可されたコンパイラー最適化の変更)。実行時に動的言語をチェックするのは非常に非効率的です。最初の分析では、それは各影響に対して変数がconstであるかどうかをチェックすることを意味します。これは最適化できますが、それでもメリットはありますか?

技術的な側面以外にも、各言語には独自の哲学があることを忘れないでください。 Pythonの通常の選択は、「制限」ではなく「慣習」を優先することです。例として、定数はすべて大文字で綴る必要があります。技術的な強制はありません。それは単なる規則に従います。これに従うと、プログラムは「他のプログラマ」が期待どおりに動作します。「定数」を変更する場合、Pythonは文句を言わないでしょう。しかしあなたはあなたが「何か悪いこと」をしているように感じるべきです。あなたは慣習を破ります。たぶんあなたにはそうする理由があるのでしょう。

最後に、動的言語では、プログラムの「正確さ」は、コンパイラーの手にあるよりも、単体テストの責任の方がはるかに重要です。ステップを作成するのが本当に難しい場合は、いくつかの「コードチェッカー」が見つかります。それらは PyLintPyCheckerPyFlakes ...です。

22
Sylvain Leroux

なぜこの設計決定が行われたのかはわかりませんが、定数の主な利点がすでに利用可能であるため、明示的なconstキーワードはないというのが私の個人的な推測です。

  • 定数は、ドキュメントの目的に適しています。定数が表示されている場合は、変更できないことがわかります。これは、命名規則によっても可能です。

  • 定数は関数呼び出しに役立ちます。定数をパラメータとして関数に渡すと、変更されないことが保証されます。 Python関数は「call-by-value」ですが、python変数は参照であるため、参照のコピーを効率的に渡すことができます。関数の内部では、参照を変更しますが、再割り当てした場合、変更は関数のスコープ外では保持されません。したがって、数値を変数として渡すと、実際には定数のように渡されます。新しい値を変数に割り当てることができます。しかし、関数の外では、まだ古い番号を取得しています

さらに、constキーワードがあった場合、非対称が作成されます。変数はキーワードなしで宣言されますが、constはキーワード付きで宣言されます。論理的な結果として、varという名前の2番目のキーワードが作成されます。これはおそらく好みの問題です。個人的には、変数宣言には最小限のアプローチを好む。

タプルのような不変のデータ構造を扱う場合は、おそらくもう少しタイプセーフを実現できます。ただし、タプル自体は変更できないので注意してください。ただし、変更可能なオブジェクトへの参照が含まれている場合、タプルに属していても変更可能です。

最後に、このスニペットを確認することをお勧めします。 http://code.activestate.com/recipes/65207-constants-in-python/?in=user-97991 わからないこれが「クラスレベルの定数」の実装である場合。しかし、私はそれが役に立つかもしれないと思いました。

4
lhk