45

私は C の背景から来て、Python を学んでいます。明示的な型安全性の欠如は気がかりですが、私はそれに慣れています。組み込みのコントラクト ベースのプログラミング (純粋な抽象クラス、インターフェイス) の欠如は、動的言語のすべての利点に直面して慣れる必要があります。

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

4

2 に答える 2

25

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

前者は静的型付けです。後者は動的です。

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

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

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

技術的な側面を超えて、各言語には独自の哲学があることを忘れないでください。Python では、通常、「制限」ではなく「規則」を優先します。例として、constant はすべて大文字で綴る必要があります。そのための技術的な強制はありません。それは単なる慣習です。それに従えば、あなたのプログラムは「他のプログラマー」が期待するように動作します。「定数」を変更することにした場合、Python は文句を言いません。しかし、あなたは「何か間違ったことをしている」と感じるはずです。あなたは慣習を破ります。そうする理由があるのか​​もしれません。多分あなたは持ってはいけません。あなたの責任。

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

于 2013-06-25T08:06:05.970 に答える
4

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

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

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

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

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

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

于 2013-06-25T08:12:03.780 に答える