为什么pylint对象是单个字符变量名?

时间:2014-02-17 16:08:03

标签: python pylint naming-conventions

我仍然习惯于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个字符之间,但我查看了{{3关于单个小写字母,我没有看到任何明确的内容,我确实看到很多使用它们的例子。

PEP8中是否有我遗漏的东西,或者这是pylint独有的标准?

5 个答案:

答案 0 :(得分:90)

关于gurney alex注意到的更多细节:你可以告诉PyLint为variable names制作例外情况(即你小指发誓),即使少于三个字符也是如此。在[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是我添加的变量名。

答案 1 :(得分:46)

PyLint不仅检查PEP8建议。它也有自己的建议,其中之一是变量名称应该是描述性的而不是太短。

您可以使用它来避免这么短的名字:

my_list.extend(x_values)

或者调整PyLint的configuration告诉PyLint变量名是什么好的。

答案 2 :(得分:15)

在强类型语言中,1个字母的名称变量可以是ok-ish,因为您通常会在变量声明或函数/方法原型中获取名称旁边的类型:

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)

你甚至可以添加一个文档字符串来解释这些内容的作用以及预期的类型。

答案 3 :(得分:13)

更深层次的原因是您可能记得您的意图abcxyz这意味着当你编写代码时,但是当其他人阅读代码时,或者甚至当你回到你的代码时,代码在你给它一个语义名称时变得更加可读。我们不是在黑板上写东西然后擦除它。我们编写的代码可能会持续十年或更长时间,并且可以多次阅读。

使用语义名称。我使用的语义名称类似于ratiodenominatorobj_generatorpath等。可能需要额外的一两秒才能输出它们,但是你节省的时间甚至半个小时之后想要弄清楚你写的东西是值得的。

答案 4 :(得分:13)

现在还有一个覆盖regexp的选项。即如果你想允许单个字符作为变量:

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

因此,pylint将与PEP8匹配,并且不会在顶部带来其他违规行为。您也可以将其添加到.pylintrc