PEP 8是否需要在函数参数中围绕运算符的空格?

wxl*_*ife 25 python coding-style pep8

我有这个代码:

some_list = range(a, b+1)
Run Code Online (Sandbox Code Playgroud)

vim的pep8插件检查我的编码风格后,我得到了这个警告:

missing whitespace around operator
Run Code Online (Sandbox Code Playgroud)

似乎要符合PEP 8我应该写这个吗?

some_list = range(a, b + 1)
Run Code Online (Sandbox Code Playgroud)

但我已多次阅读PEP 8 - Python代码样式指南,但无法找到适用于上述警告的规则.

所以我想知道:当使用PEP-8样式时,在函数的参数中是否需要围绕运算符(+, - ,*,/等)的空格?

Mar*_*ery 49

当你在2013年提出要求时,你的Vim插件是错误的...但是在2010年,当它被创作时.PEP 8已经多次改变,你问题的答案也发生了变化.

最初,PEP 8包含以下短语:

算术运算符周围的空格

根据规则,

range(a, b+1)
Run Code Online (Sandbox Code Playgroud)

是毫无疑问的错误,应该写成

range(a, b + 1)
Run Code Online (Sandbox Code Playgroud)

这就是pycodestyle(Python linter,以前称为pep8.py,提问者的Vim插件在引擎盖下使用)实施了几年的规则.

然而,在2012年4月发生了变化.这种直截了当的语言没有留下任何自由裁量权的空间被这个非常简单的建议所取代:

如果使用具有不同优先级的运算符,请考虑在具有最低优先级的运算符周围添加空格.用你自己的判断; 但是,永远不要使用多个空格,并且在二元运算符的两边始终具有相同数量的空白.

令人困惑的是,说明这条规则的例子原本保持不变(因此与散文相矛盾).这最终是固定的,但不是很好,这些例子仍然令人困惑,似乎意味着比散文更严格,更不主观的规则.

仍然有一条规则要求某些特定运算符周围空格:

总是围绕这些二元运算符在任一侧的单个空间:分配(=),增量赋值(+=,-=等),比较(==,<,>,!=,<>,<=,>=,in,not in,is,is not),布尔值(and,or,not).

但要注意,这个规则是明确了解哪些运营商是指和算术运算符一样+没有在列表中.

因此,PEP目前的形式并没有规定你是否应该在+运算符周围使用空格(或者像*/和其他算术运算符**).你可以"自己动手".

顺便说一句,pycodestyle linter 在2012年末改变了它的行为,以反映PEP的变化,将运算符周围的空格分为两个错误代码E225(因为PEP 8仍然需要空格的操作符周围没有使用空格默认情况下启用,并且E226(未使用算术运算符周围的空格),默认情况下会被忽略.鉴于他所看到的错误,问题提问者在2013年提出这个问题时,肯定会使用略显过时的版本.

  • 谢谢你彻底的答复.考虑到x*y ^ 2空格的最佳方法,我来到这里.我认为`x*y**2`更难读,有时候我会考虑`x*y**2`但是`**'周围的空间对我来说总是很奇怪.我决定根据这个答案选择`x*y**2`. (6认同)

mus*_*.0x 17

http://www.python.org/dev/peps/pep-0008/#other-recommendations

始终围绕这些二元运算符,两边都有一个空格:赋值(=),扩充赋值(+ =, - =等),比较(==,<,>,!=,<>,<=,> = ,in,not in,is,is not),布尔(和,或者,不是).

例外情况=是用于设置命名参数的时间.

编辑:

我查看了Python标准库的源代码,发现上面出现的场景:

http://hg.python.org/cpython/file/9ddc63c039ba/Lib/json/decoder.py#l203

            end = _w(s, end + 1).end()
Run Code Online (Sandbox Code Playgroud)

  • @John Faulkner` + - */`不在这些运算符中.事实上,如果您阅读下面的规则,您会发现像'a = a*b + c`这样的代码样式是正确的 (9认同)
  • @ wxl24life非常正确,然后继续指出在下面的规则中`a = a*b + c`是对的.但正如我上面所指出的那样,他们建议你在优先级没有差别时应该包括空格,并且当优先级有这样的差异时将其排除在外,那些条件b + 1(如你的问题中)将是错误的,而a*b + 1则是正确的.但老实说,你会对此进行评分吗?如果不在你喜欢的地方使用b + 1 :) (4认同)
  • -1; 引用的段落和代码根本不支持您的结论。PEP 中的段落明确列出了必须使用空格的*特定运算符*,并且该列表不包括“+”。并且作者*选择*在 Python 源代码中某处的 `+` 运算符周围使用空格这一事实绝不能证明在 PEP 8 下这种使用空格是*强制*的。 (4认同)
  • 显然,你提到的规则不能适用于我的问题,抱歉 (2认同)