为什么pylint反对单字符变量名?


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特有的标准?

Answers:


47

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

您可以使用它来避免这样的短名称:

my_list.extend(x_values)

或调整PyLint的配置,以告诉PyLint什么变量名是好的。


10
使用_持有临时值是反模式。下划线变量表示无关/丢弃的值,而不是临时赋值,例如ix。此外,在解释器中,保留最后一个表达式的最后一个值具有特殊含义。
詹姆斯

122

关于格尼alex所指出的内容的更多详细信息:您可以告诉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

22

在强类型语言中,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)

您甚至可以添加一个文档字符串来说明这些东西的作用以及期望的类型。


7
而不是“编译语言”,我会写“明确键入”。Haskell,例如,也可以编译,但是您可以像在Python中一样编写隐式声明。
塞巴斯蒂安·马赫2014年

14
尽管在这些情况下我确实同意您的观点,但在变量名中强制使用3个或更多字符并不意味着它具有描述性。with open(FILE) as f: items = f.readlines()例如,我当前使用的变量f确实很明显,但是却收到pylint警告。这使我变成了flake8。
2014年

3
您还可以更改pylint规则以允许“ f”为变量名。i,j AFAIR已经存在例外。
gurney alex14年

10
对于拒绝该答案的人:我是在Pylint中引入该规则的人,原因恰恰是给出的原因。您可能不同意这个决定,但这仍然是问题的答案……
gurney alex

1
我完全遵循您的推理,但是在算法和数学编程中,某些值通常以一个字母命名。我认为一个被调用的函数与被调用的c f完全不同OptionList。特别是当我无法将其重命名为,function因为它隐藏了内置的内容时。
kap

19

如今,还有一个选项可以覆盖正则表达式。即,如果您想允许单个字符作为变量:

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

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


3
对于版本,> 1.8.3这似乎是答案。也可以将其放入.pylintrc永久配置中variable-rgx=[a-z0-9_]{1,30}$
詹姆斯

7
--variable-rgx =“ [a-z _] [a-z0-9 _] {0,30} $”可能更合适,“ 9”不应为有效的变量名。
埃里克·勒堡

16

更深层次的原因是,你可能还记得你的原意abcxy,和z是指当你写你的代码,但是当别人读它,甚至当你回到你的代码,代码变得更加可读当你给它是一个语义名称。我们不会在黑板上写东西然后再擦除它。我们正在编写的代码可能会存在十年或更长时间,并且会被阅读很多次。

使用语义名称。我使用语义的名称一直喜欢ratiodenominatorobj_generatorpath,等这可能需要额外的两秒钟他们打出来,但是你节省试图找出你所写的,甚至一半,然后一小时的时间是值得的。


7
谢谢。这是最终的代码-gist.github.com/amandabee/8969833-我看到您对我(或您)一年可以阅读的代码的观点,但是在这种情况下,我认为x和y确实具有描述性。
阿曼达

OTOH如果我要从XML文档中提取元素<dt />,将其存储在变量'dt'中似乎很清楚,而将其存储为'date'(这正是该元素恰好代表的意思)可能会造成混淆,编造“ the_dt_field”之类的东西只是愚蠢的漏水。(不,我无法控制元素的名称;它是其他人的架构。)必须有许多这样的异常可以测试规则。
马克伍德
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.