本当に定数にすべて大文字を使用する必要がありますか?


34

私は主にパイリントを使用してソースコードをリントするPythonプログラマです。1つを除くすべての警告を削除できます:定数の名前が無効です。名前をすべて大文字に変更すると修正されますが、本当にそうすることになっていますか?私がそれを行うと、ほとんどの変数が定数であるため、コードがいように見えます(pylintによると)。


1
ほとんどの変数がモジュールレベルの定数である場合、おそらく何か異常なことをしているでしょう。それらのほとんどは関数内に存在するはずです。
RemcoGerlich

1
Pylintが定数であると考えているコードのサンプルを見せてください。
ウィンストンイーバート

@WinstonEwertNOTES_DIRECTORY = argv[1] chdir(NOTES_DIRECTORY) FILES = glob('*.txt') RAND_FILE = choice(FILES) with open(RAND_FILE) as notes_file: POINTS = notes_file.readlines() RAND_POINT = choice(POINTS)
アビシェーククマール

@AbhishekKumar、あなたのコードは関数内にありますか、それともトップレベルですか?
ウィンストンイーバート

@WinstonEwertトップレベルで、PyLintの指示に従ってください。
アビシェーク・クマール

回答:


33

おそらく次のようなコードを書いています:

notes_director = argv[1]
chdir(notes_director)
files = glob('*.txt')
rand_file = choice(files)
with open(rand_file) as notes_file: 
    points = notes_file.readlines() 
    rand_point = choice(points)

このコードを関数に移動する必要があります。

def main():
    notes_director = argv[1]
    chdir(notes_director)
    files = glob('*.txt')
    rand_file = choice(files)
    with open(rand_file) as notes_file: 
        points = notes_file.readlines() 
        rand_point = choice(points)

# actually call the main function    
main()

Pylintは、実際に作業を行うコードは関数内にあると想定しています。このコードは関数内ではなくコードの最上位にあるため、混乱します。

一般的に、トップレベルではなく関数内で作業を行う方が良いスタイルです。これにより、実行中の作業をより適切に整理し、再利用しやすくなります。実際には、迅速で汚いスクリプト内の関数の外部でアルゴリズムを実行するコードのみが必要です。


1
強く反対します。モジュールレベルの変数を使用するPythonの理由はたくさんあると思います。このアドバイスはPEP8を誤読しているパイリントの単なる成果物であり、「定数はモジュールレベルでなければならない」という逆も当てはまると思います。
MetricSystem

21

はい。定数に関するPEP8の規則によると:

通常、定数はモジュールレベルで定義され、単語を区切るアンダースコアですべて大文字で記述されます。例にはとが含まMAX_OVERFLOWTOTALます。

ロングバージョン:

Pythonコミュニティ(他の多くのコミュニティと同様)には、コードの記述方法に関する規約があります。これは、作業コードとは異なります。定数をすべて小文字で記述しても、コードは機能します。

しかし、のようなツールで「強制」される(PEP8に記載されているように)コミュニティのコンセンサスがあるpylint。あなた自身の幸福のためにプログラムする場合、あなたはピリントがあなたに与えるヒントを無視するかもしれません。コミュニティとのオープンな交換(別名「自分以外の誰かが私のコードを使用する」)が必要な場合は、PEP8に従ってコードを準備する必要があります。


7
一方、pylintそれを間違えることは完全に可能です。Pythonは、定数が常に同じ値を持つことが期待されることを除いて、定数と変数を区別する方法を提供しません。pylint一度だけ設定され、変更れないものはすべて定数であると想定していますが、定数を意図していない限り、それは単に実装の成果物である可能性があります。具体的には、質問へのコメントで与えられたコードは実行ごとに異なる値を持っているため、pylintがそうだと思っていても定数と見なすべきではありません。
ジュール

@Jules一度設定した変数を呼び出して、実行時に変更することは定数ではなく、多くの言語(JSなど)にconstキーワードが存在します。初期値は異なるかもしれませんが、多分以外PIです。
トーマスジャンク

1
不変の変数(つまり、実行時に設定され、変更されないもの)と定数(つまり、実行されるすべてのプログラムで同じもの、および言語がそれを行うオプションを提供する場合、コンパイル時に計算できるもの)を区別します)...ポイントは、Pythonへの区別を指定する方法がないためpylint、前者の場合でも後者を想定しているということです。
ジュール

Pylintは間違いで間違っています。「定数はモジュールレベルでなければなりません」と読み、逆に「モジュールレベルは定数でなければなりません」と想定しているからです。しかし、それ以外の点では優れた便利なツールであるため、私たちはそれにこだわっているようです。
MetricSystem

@MetricSystemあなたの意見では、モジュールレベルの変数は定数である以外に何を持っていますか?可変である必要がありますか?
トーマスジャンク

13

PEP8およびPythonコミュニティの標準はを使用することALL_CAPS_CONSTANTSです。これは、C、Java、Perl、PHP、Python、bash、その他のプログラミング言語およびシェル環境で何十年も使用されている一般的な視覚的手がかりです。しかし、現代のオンライン用語では、すべてのキャップは叫びを意味します。そして叫びは失礼です。

ただし、Pythonはについて一貫性がありませんALL_CAPS_CONSTANTS。JavaScriptにはありますがMath.PI、Pythonにはありmath.piます。認識可能な、または永続的な定数はπよりもありません。またはsys.version_info、実行しているPythonのバージョンを検討してください。プログラムの寿命全体にわたって100%の定数- 定義した定数PORTまたはMAX_ITERATIONSそれ以上の定数。それともどうsys.maxsize?プラットフォームの最大ネイティブ整数値は、1つまたは2つのプログラムの実行だけでなく、ハードウェアの寿命にわたって一定です。

これらの定数場合- πと宇宙の基本的な定数である電子のようないくつかを含めて、すべて永遠に渡って変化しません-場合、彼らは小文字、よく...そうすることができます他の定数とすることができます。選んでいいですよ。

PEP8はスタイルガイドであることに注意してください。ガイドラインではなく、法律。ガイドラインは、多くの場合、Pythonの標準ライブラリでも違反します。そして、もう1つのコアPythonガイドラインであるPEP20(別名「The Zen of Python」)を引用します。

  • いよりも美しい
  • 可読性カウント
  • 実用性は純度よりも優れています。

実用的な注意として、プログラムが格子状にYELLY_CONSTANTなりSHOUTY_PARAMETER始めると、一般に全キャップ定数はプラトンの理想に耐えることではなく、プログラムのパラメーターが実行されることを覚えておくと役立ちます。、、またはについてPORTSITENAME、本当に一定のものはなくNUMRUNS、スタンドアロンプ​​ログラムグローバルとして管理する必要はありません。たとえば、これらはグローバルにアクセス可能なプログラムパラメーターのバンドルとして辞書にドロップできます。

config = {
    'port': 80,
    'sitename': "Bubba's Blog",
    'numruns': 100,
}

Pythonには、使用する必要性を軽減する優れたキーワードパラメーター受け渡し機能もありますAPPARENTLY_ANGRY_GLOBAL_VARIABLES

def process_data(sitename, port=80, numruns=100):
    ...

process_data("Bubba's Blog")

実際には、これらの値の多くは、構成ファイル、OS環境変数、コマンドライン引数、または制御原理/パターンの反転を満たす他のソースから読み取られます(またはそうする必要があります)。しかし、それは別の日の大きな話です。


1

はい、それはほとんどのプログラミング言語(少なくとも私が使用する言語)で非常に一般的です。

このGoogleリンクを参照して、同じチームの開発者間で共通のスタイルを共有できます。

使用することをお勧めします

Type                  |Public          |Internal
Global/Class Constants|CAPS_WITH_UNDER |_CAPS_WITH_UNDER
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.