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

我仍然习惯于 Python 的约定,并且使用 Pylint 使我的代码更加 Python 化,但是我对于 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 独有的标准?

63044 次浏览

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

你可以用这个来避免这样的短名字:

my_list.extend(x_values)

或者调整 Pylint 的配置来告诉 Pylint 哪个变量名更好。

更深层次的原因是,当你写代码的时候,你可能记得你想要的 abcxyz是什么意思,但是当其他人读它的时候,甚至当你回到你的代码的时候,当你给它一个语义名称的时候,代码变得更加可读。我们不会把东西写在黑板上然后再擦掉。我们正在编写的代码可能会存在十年或更长的时间,并被读取很多很多次。

使用语义名称。我使用过的语义名称有 ratiodenominatorobj_generatorpath等等。把它们打出来可能需要额外的一两秒钟,但是你节省下来的时间,即使是半个小时之后,也是非常值得的。

在显式类型语言中,一个字母的名称变量可以是 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)

您甚至可以添加一个 docstring 来解释这些内容的作用以及预期的类型。

关于什么是 轮床 Alex 注意到了的更多细节: 你可以告诉 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 是我添加的变量名。

现在还有一个选项可以覆盖 regexp,也就是说,如果您希望允许单个字符作为变量:

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

因此,Pylint 将匹配 PEP8,并且不会在顶部带来额外的违规。

Pylint 现在有了 good-names-rgxs,它添加了额外的正则表达式模式以支持变量名。

区别在于,variable-rgx将覆盖以前的任何规则,而 good-names-rgxs在现有规则之上添加规则。这使得它更加灵活,因为您不需要担心打破以前的规则。

只要将这一行添加到 pylintrc,就可以允许1或2个长度变量名称:

good-names-rgxs=^[_a-z][_a-z0-9]?$


^          # starts with
[_a-z]     # 1st character required
[_a-z0-9]? # 2nd character optional
$          # ends with

pylint本身生成的配置允许 i, j, k, ex, Run,但不允许 x,y,z

一般的解决方案是调整您的 .pylintrc,无论是为您的帐户($HOME/.pylintrc)或您的项目(<project>/.pylintrc)。

首先安装 pylint,也许在你的 .env里面:

source myenv/bin/activate
pip install pylint

接下来运行 pylint,但是文件太长,无法从一开始就手动维护,所以保存在旁边:

pylint --generate-rcfile > ~/.pylintrc--full

看一下生成的 ~/.pylintrc--full,其中一个代码块会说:

[BASIC]


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

随意调整此块(添加 x,y,..)以及任何其他块,并将选定的摘录复制到 ~/.pylintrc(或 <project>/.pylintrc)中。