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


96

私はまだpythonの慣習に慣れておりpylint、コードをよりpythonicにするために使用していますが、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の命名規則を調べましたが、小文字の小文字については何も明示されていません。 、そして私はそれらを使用する多くの例を見ています。

PEP8に欠けているものはありますか、それともPylintに固有の標準ですか?

回答:


47

PyLintはPEP8の推奨事項だけをチェックしません。また、独自の推奨事項もあり、そのうちの1つは、変数名がわかりやすく、短くなりすぎないようにすることです。

これを使用して、このような短い名前を回避できます。

my_list.extend(x_values)

または、PyLintの設定を調整して、どの変数名が適切かをPyLintに伝えます


10
_一時的な値を保持するために使用することはアンチパターンです。アンダースコア変数は無関係な/のような値ではなく、一時的に割り当て、破棄を示しているiかをx。さらに、インタプリタでは、最後の式の最後の値を保持するという特別な意味があります。
James

121

gurney alexが指摘したことについてもう少し詳しく:3文字未満であっても完全に明確な変数名(小指で誓う)を例外にするようにPyLintに指示できます。ヘッダーの下のpylintrcファイルを見つけるか、追加します[FORMAT]

# 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は、追加した変数名です。


7
これが最良の答えです。
giorgiosironi

1
では動作しないようですpylint 1.8.3pylint.pycqa.org/en/1.8/user_guide/options.html
James


2
私が本当に望んでいるのは、理解に使用されている場合、pylintが(要求に応じて)短い変数を受け入れるようにすることです。比較 return [customer_address for customer_address in thing.get_customer_addresses() if customer_address.is_proper()]return [a for a in thing.get_customer_addresses() if a.is_proper()] 私は文脈から明らかなように、後者は、より明確であると主張。一般に、可変長は変数のスコープと相関する必要があります。
EdvardM

21

強く型付けされた言語では、通常、変数の宣言または関数/メソッドのプロトタイプで名前の横に型を取得するため、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を加えることさえします。


7
「コンパイルされた言語」の代わりに、「明示的に型付けされた」と書きます。たとえばHaskellもコンパイルされますが、Pythonのように暗黙の宣言を書くことができます。
セバスチャンマッハ

14
これらのケースでは私はあなたに同意しますが、変数名に3文字以上を強制しても、それが説明になるとは限りません。私は現在with open(FILE) as f: items = f.readlines()、たとえば、変数fが本当に明白である場所を使用していますが、パイリントの警告が表示されます。これにより、私はflake8に変更されました。
AxelÖrnSigurðsson

3
'f'に変数名を許可するように、pylintルールを変更することもできます。i、j AFAIRにはすでに例外があります。
ガーニーアレックス2014

10
この回答に反対票を投じた人々のために:私はPylintでルールを導入した男であり、その理由はまさに与えられたものです。あなたはこの決定に同意しないかもしれませんが、それでも質問に対する答えです...
ガーニーアレックス

1
私は完全にあなたの推論に従いますが、多くの場合、アルゴリズムと数学プログラミングでは、いくつかの値は通常1文字で名前が付けられています。呼び出された関数fは、OptionList呼び出されたc とはまったく異なると思います。特にfunction、組み込みをシャドウしているために名前を変更できない場合。
KAP

19

最近では、正規表現を上書きするオプションもあります。つまり、単一の文字を変数として許可する場合は、次のようにします。

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

そのため、pylintPEP8に一致し、追加の違反は発生しません。また、に追加することもできます.pylintrc


3
バージョンの> 1.8.3場合、これが答えのようです。これ.pylintrcを永続的な設定のためにあなたにも置くことができます:variable-rgx=[a-z0-9_]{1,30}$
James

7
--variable-rgx = "[a-z _] [a-z0-9 _] {0,30} $"の方が少し適切かもしれませんが、 "9"は有効な変数名であってはなりません。
Eric Le Fort

16

深い理由は、あなたが意図したものを覚えているかもしれないということですabcxy、とzあなたのコードを書いたときを意味するが、他の人がそれを読んだとき、またはあなたのコードに戻ってきた場合でも、コードはあなたが与えるとき、ずっと読みやすくなり、それは意味的な名前です。一度黒板に書いてそれを消すことはしません。私たちは、10年以上も存続し、何度も読まれる可能性のあるコードを書いています。

セマンティック名を使用します。私が使用したセマンティック名は次のようになっているratiodenominatorobj_generatorpathそれはそれらを入力するために余分な1秒か2秒かかる場合がありますなど、しかし、あなたはあなたがしてからも、半分の時間を書いたかを把握しようとして保存する時間は十分に価値があります。


7
ありがとう。これが最終的なコードです-gist.github.com/amandabee/8969833-私(またはあなた)が1年間で読み取ることができるコードについてのあなたの見解はわかりますが、この場合、xとyは本当に説明的だと思います。
アマンダ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.