web-dev-qa-db-ja.com

キーとして文字列リテラルの代わりにPythonで文字列定数を使用することには意味がありますか?

「速度」、「death_star_power_output」など、ソリューションの特定の部分を識別するキーとして、有益な短い文字列定数を含む辞書が私のクラスにあります。同僚がVELOCITY="velocity"およびDEATH_STAR_POWER_OUTPUT="death_star_power_output"練習であるため、プログラム全体でこのディクショナリにインデックスを付けます。

私は他のプログラミング言語からのそのような慣行を知っていますが、それらが実用的な目的を果たします-つまり、文字列のスペルミスが発生した場合に迅速に失敗することです-Python 。 両方とも:

value = dictionary["death_star_powder_output"]

そして

DEATH_STAR_POWER_OUTPUT="death_star_power_output"
[...]
value = dictionary[DEATH_STAR_POWDER_OUTPUT]

同時に失敗します。 POWERのスペルミスがPOWDERであることに注意してください。この種のPythonの実践に関する公式のガイドラインはありますか?

5
loa_in_

Pythonは識別子の厳密な事前宣言を強制しないため、Pythonで文字列リテラルを避けることはそれほど有用ではありませんが、それでも有用です。

Pythonで定数名のスペルを間違えると、実行時まで警告が表示されない可能性があるのは事実です。しかし、十分に賢いアナライザーは、宣言がないように見える変数を使用していること、または使用されていないように見える定数を宣言していることを依然として検出できます。また、ツールのサポートは時間の経過とともに賢くなるだけであり、ツールのサポートは言語標準よりもはるかに速く変更されるため、既に存在するかどうかに関係なくエラーチェックを改善するための規則に従う必要があります。

7
Kilian Foth

Kilian Fothが与えた理由に加えて、そもそも定数を使用する最も基本的な言語に依存しない理由の1つは、逆説的に、コードを変更しやすくするためです。

定数は、プログラムの実行に関して「一定」です。つまり、定数にはプログラムで変更されない値が必要です。それにもかかわらず、プロジェクトの要件は変化する可能性があり、実際に変化します。変化すると、プログラマーの時間を浪費したり、潜在的なバグを導入したりすることなく、すべてのハードワークを再利用できます。

Pythonが定数からフェイルファストのメリットを具体的に受けるかどうかに関係なく、少なくとも一般的に定数を使用する基本的なメリットを得ます。

1
Ben Mordecai

バージョン1.5以降、Python=を使用している人として、これは「慣習ではありません」。

このようなことをする理由はいくつか考えられます。 1つはローカリゼーションです。もう1つは文字列の再利用です。

ローカリゼーションの場合、すべての表示文字列をローカリゼーションチームが簡単にアクセスできるようにする必要がありますが、これらはユーザーに表示される文字列であり、ディクショナリインデックスなどの内部文字列ではありません。

再利用の場合、変数が文字列全体をミラーリングすることを望まないでしょう、それはむしろ役に立たないですが、このようなものはより理にかなっているかもしれません:

user_error = "The software has encountered an error, probably your fault"
system_error = "This crummy software is bad, and it has hit a problem"

そして、これらの変数を別の場所で、または複数回使用する可能性があります。そして、コード全体ですべてのインスタンスを見つけることなく、正確なメッセージを後で変更することができます。

0
jgritty