web-dev-qa-db-ja.com

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

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

37
Abhishek Kumar

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

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は、実際に機能するコードが関数内にあると想定しています。このコードは、関数内ではなくコードのトップレベルにあるため、混乱します。

一般的に言えば、トップレベルではなく関数内で作業する方が良いスタイルです。これにより、作業内容をより適切に整理し、再利用を促進できます。実際には、関数の外でアルゴリズムを実行するコードのみをすばやくダーティなスクリプトに含める必要があります。

33
Winston Ewert

はい。 定数 に関するPEP8のルールによると:

定数は通常モジュールレベルで定義され、単語をアンダースコアで区切ってすべて大文字で記述されます。例にはMAX_OVERFLOWおよびTOTAL

ロングバージョン:

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

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

22
Thomas Junk

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

ただし、PythonはALL_CAPS_CONSTANTSについては一貫性がありません。 JavaScriptにはMath.PIが含まれる場合がありますが、Pythonにはmath.piが含まれます。認識できる定数または永続する定数はπ以外ありません。または、実行中のPythonのバージョンであるsys.version_infoを検討してください。プログラムの存続期間中、100%の定数。PORTまたはMAX_ITERATIONSまたは定義した他の定数をはるかに超えています。または、sys.maxsizeはどうですか?プラットフォームのネイティブ整数の最大値は、1つまたは2つのプログラム実行だけでなく、ハードウェアの寿命を通じて一定です。

これらの定数-宇宙の基本定数であるπやeなどを含み、すべての永遠に変化しない場合-theyが小文字、まあ...他の定数も同様です。選んでいいですよ。

PEP8 はスタイルガイドです。法律ではなくガイドライン。 Pythonの標準ライブラリでさえもしばしば違反するガイドライン。そして別のコアPythonガイドラインを引用して、 PEP2 (別名 "The Zen of Python"):

  • 醜いより美しい
  • 読みやすさのカウント
  • 実用性は純粋さを上回ります。

実際的な注意として、プログラムのYELLY_CONSTANTSHOUTY_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環境変数、コマンドライン引数、または 制御の反転 原則/パターンを満たすための他のソースから読み取られます(または読み取られる必要があります)。しかし、それは別の日の大きな話です。

16
Jonathan Eunice

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

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

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

Type                  |Public          |Internal
Global/Class Constants|CAPS_WITH_UNDER |_CAPS_WITH_UNDER
1
alain.janinm

コードは、定数を大文字にするかどうかに関係なく機能します。これらのいわゆる「定数」は、コード実行中に変更されない単なる変数です。

私の個人的な見解では、大文字にすると、定数であることを思い出しやすくなります。

import operator

OPERATIONS = {"+": operator.add, "-": operator.sub}

def check_answer(num_1, num_2, operation, user_answer):
    correct_answer = OPERATIONS.get(operation)(num_1, num_2)
    is_correct = user_answer == correct_answer
    return (is_correct, correct_answer)

また、PEP8は 大文字を使用する必要があります と述べています。

0
Gaetano Barreca