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

Ama*_*nda 87 python naming-conventions pylint

我仍然习惯于使用python约定并使用它pylint来使我的代码更加pythonic,但我对pylint不喜欢单个字符变量名这一事实感到困惑.我有几个像这样的循环:

for x in x_values:
   my_list.append(x)
Run Code Online (Sandbox Code Playgroud)

当我跑pylint,我得到Invalid name "x" for type variable (should match [a-z_][a-z0-9_]{2,30}- 这表明有效的变量名称必须在3到31个字符之间,但我已经查看了PEP8命名约定,我没有看到关于单个小写字母的任何明确的,我确实看到很多使用它们的例子.

PEP8中是否存在我缺少的东西,或者这是pylint独有的标准?

mln*_*ncn 99

关于gurney 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
Run Code Online (Sandbox Code Playgroud)

这里pk(对于主键),x和y是我添加的变量名.

  • 为了帮助 VS Code 用户,请将以下内容添加到 `settings.json` 文件中以正确配置 pylint: `"python.linting.pylintArgs": ["--good-names=i,j,k,ex,Run,_ ,pk,x,y,z,e"]` (9认同)
  • 这是最好的答案. (5认同)
  • 我真正想要的是让 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()]```我认为后者更清楚,因为 a 从上下文中显而易见。一般来说,变量长度应与变量的范围相关。 (2认同)

war*_*iuc 47

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

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

my_list.extend(x_values)
Run Code Online (Sandbox Code Playgroud)

或者调整PyLint的配置以告诉PyLint哪个变量名称是好的.

  • 使用`_`来保存临时值是反模式的.下划线变量表示不相关/丢弃的值,而不是临时赋值,例如`i`或`x`.此外,在解释器中,它具有保存最后一个表达式的最后一个值的特殊含义. (10认同)

gur*_*lex 18

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

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

在Python中,你没有得到这些信息,所以如果你写:

def check_modality(a, b, c):
    v = build_checker(a, b)
    return v.check_option(c)
Run Code Online (Sandbox Code Playgroud)

对于维护团队来说,你完全不知道该功能可以做什么,它是如何调用的,以及它返回的内容.所以在Python中,您倾向于使用描述性名称:

def check_modality(name, mode, option_list):
    checker = build_checker(name, mode)
    return checker.check_option(option_list)
Run Code Online (Sandbox Code Playgroud)

你甚至可以添加一个docstring来解释这些东西的作用以及预期的类型.

  • 虽然我在这些情况下同意你的意见,但在变量名中强制使用3个或更多字符并不意味着它具有描述性.我目前正在使用`with open(FILE)作为f:items = f.readlines()`例如,变量`f`非常明显,但我得到了pylint警告.这让我改成了flake8. (12认同)
  • 对于那些赞同这个答案的人:我是在Pylint中引入规则的人,原因正是给出的那个.你可能不同意这个决定,但这仍然是问题的答案...... (8认同)
  • 我会写"明确打字"而不是"编译语言".例如,Haskell也被编译,但你可以像Python一样编写隐式声明. (7认同)
  • 我完全遵循你的推理,但在算法和数学编程中,一些值通常用一个字母命名。我认为名为“f”的函数与名为 c 的“OptionList”完全不同。特别是当我无法将其重命名为 `function` 时,因为它隐藏了一个内置函数。 (4认同)
  • 您还可以更改pylint规则以允许'f'为变量名称.i,j AFAIR已经有例外. (2认同)
  • 叹息......Python *是*强类型的。那么你的观点到底是什么?您指的是“动态类型”吗?即便如此,Python 现在也支持静态类型提示。您的规则对无意义的变量名称“for file in range(numpy):”感到满意,但抱怨“for i in range(n):”。这是一个错误的决定,而且理由也不充分。 (2认同)

Jim*_*ian 16

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

pylint --variable-rgx="[a-z0-9_]{1,30}$" <filename>
Run Code Online (Sandbox Code Playgroud)

因此,pylint将匹配PEP8并且不会在顶部带来额外的违规.您也可以将其添加到.pylintrc.

  • 对于版本`> 1.8.3`,这似乎是答案.可以将它放在你的`.pylintrc`以及永久配置中:`variable-rgx = [a-z0-9 _] {1,30} $`. (3认同)
  • --variable-rgx =“ [a-z _] [a-z0-9 _] {0,30} $”可能更合适,“ 9”不应为有效的变量名。 (3认同)

Aar*_*all 15

更深层次的原因是,你可能还记得你的原意a,b,c,x,y,和z是指当你写你的代码,但是当别人读它,甚至当你回到你的代码,该代码将成为当你给更可读它是一个语义名称.我们不是在黑板上写东西然后擦除它.我们编写的代码可能会持续十年或更长时间,并且可以多次阅读.

使用语义名称.我使用语义的名称一直喜欢ratio,denominator,obj_generator,path,等这可能需要额外的两秒钟他们打出来,但是你节省时间试图找出你从那么写,甚至半小时是值得的.

  • 谢谢.这是最终的代码 - https://gist.github.com/amandabee/8969833 - 我看到你关于我(或你)一年内可以阅读的代码的观点,但在这种情况下,我认为x和y是真正具有描述性. (7认同)
  • 是的,在 20 年后,我们仍然会理解“i”是“0”和“n”之间的整数,或者“x”、“y”和“z”是描述 3D 中的点的 3 个浮点数。不过,我们可能不理解被选择来替换它们的复杂变量名称。 (4认同)

wis*_*cky 13

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
Run Code Online (Sandbox Code Playgroud)