web-dev-qa-db-ja.com

なぜpylintは1文字の変数名に反対するのですか?

私はまだpythonの慣習に慣れており、コードをよりPythonicにするためにpylintを使用していますが、pylintは単一の文字変数を好まないという事実に困惑しています名前:次のようなループがいくつかあります。

for x in x_values:
   my_list.append(x)

pylintを実行すると、Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}-有効な変数名の長さは3〜31文字でなければならないことを示唆していますが、 PEP8の命名規則 を調べましたが、1つの小文字について明確なものは見当たりません、そしてそれらを使用する多くの例を見ています。

PEP8に欠けているものはありますか、またはこれはpylintに固有の標準ですか?

85
Amanda

PyLintは、PEP8の推奨事項だけをチェックします。また、独自の推奨事項もあります。その1つは、変数名は説明的で短くてはならないということです。

このような短い名前を避けるためにこれを使用できます:

my_list.extend(x_values)

または、PyLintの configuration を調整して、PyLintに適切な変数名を伝えます。

47
warvariuc

ガーニー・アレックスが指摘したことに関するもう少し詳細:あなたはPyLintに 変数名 の例外を作るように伝えることができます。 [FORMAT]ヘッダーの下で、pylintrcファイルを検索または追加します。

# Good variable names which should always be accepted, separated by a comma
good-names=i,j,k,ex,Run,_,pk,x,y

ここで、pk(主キー)、x、およびyは、追加した変数名です。

95
mlncn

強く型付けされた言語では、通常、変数の宣言または関数/メソッドプロトタイプで名前の隣に型を取得するため、1文字の名前変数は大丈夫です。

bool check_modality(string a, Mode b, OptionList c) {
    ModalityChecker v = build_checker(a, b);
    return v.check_option(c);
}

Pythonでは、この情報を取得できないため、次のように記述します。

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)

メンテナンスチームは、関数が何を行うことができるのか、どのように呼び出されるのか、何を返すのかについてまったく手がかりを残していません。したがって、Pythonでは、わかりやすい名前を使用する傾向があります。

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)

さらに、内容と期待されるタイプを説明するdocstringを追加します。

18
gurney alex

より深い理由は、abcxy、およびzはコードを書いたときを意味しますが、他の人がコードを読んだとき、またはコードに戻ったときでさえ、コードにセマンティック名を付けると読みやすくなります。一度黒板に物を書いて、それを消去するわけではありません。私たちは、10年以上にわたって存在し、何度も何度も読むコードを書いています。

セマンティック名を使用します。私が使用したセマンティック名は、ratiodenominatorobj_generatorpathなど。それらを入力するには1〜2秒かかる場合がありますが、それから30分後でも何を書いたかを把握するのに時間を費やす価値があります。

16
Aaron Hall

現在、正規表現を上書きするオプションもあります。つまり変数として単一の文字を許可する場合:

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>

したがって、pylintはPEP8と一致し、追加の違反は発生しません。また、.pylintrcに追加することもできます。

14
Jimilian