38

我有这个代码:

some_list = range(a, b+1)

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

missing whitespace around operator

似乎为了符合 PEP 8 我应该改写这个?

some_list = range(a, b + 1)

但我已经多次阅读PEP 8 - Python 代码样式指南,只是找不到适用于上述警告的规则。

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

4

3 回答 3

65

当你在 2013 年问的时候,你的 Vim 插件是错误的……但在 2010 年,当它被创作时。PEP 8 已多次更改,您问题的答案也已更改。

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

在算术运算符周围使用空格

那个规则下,

range(a, b+1)

是明确错误的,应该写成

range(a, b + 1)

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

然而,这种情况在 2012 年 4 月发生了变化。直截了当、没有任何自由裁量余地的语言被这个更加模糊的建议所取代:

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

令人困惑的是,说明此规则的示例最初保持不变(因此与散文相矛盾)。这最终得到了解决,但不是很好,而且这些例子仍然令人困惑,似乎暗示了比散文更严格和更少主观的规则。

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

始终在这些二元运算符两边用一个空格括起来:赋值 ( =)、扩充赋值 (+=-=)、比较 ( ==, <, >, !=, <>, <=, >=, in, not in, is, is not) 布尔值 ( and, or, not)。

但请注意,该规则明确说明了它所指的运算符以及算术运算符+不在列表中

因此,当前形式的 PEP并没有规定您是否应该在+运算符(或其他算术运算符,如*and /and **)周围使用空格。你可以自由地“使用你自己的判断”

顺便说一句,pycodestyle linter在 2012 年末改变了它的行为以反映 PEP 的变化,将关于在运算符周围使用空格的规则分成两个错误代码 E225(由于未能在 PEP 8 仍然需要空格的运算符周围使用空格)周围),默认情况下是打开的,E226(因为未能在算术运算符周围使用空格),默认情况下被忽略。考虑到他看到的错误,当他在 2013 年提出这个问题时,这里的提问者一定是使用了稍微过时的 linter 版本。

于 2016-06-21T23:59:43.317 回答
25

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

始终在这些二元运算符两边加上一个空格:赋值 (=)、扩充赋值(+=、-= 等)、比较(==、<、>、!=、<>、<=、>= , in, not in, is, is not), 布尔值 (and, or, not)。

例外情况是 when=用于设置命名参数。

编辑:

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

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

            end = _w(s, end + 1).end()
于 2013-08-11T11:46:17.960 回答
2

对于算术运算符,我通常在 + 和 - 周围放置空格,但不在 *、** 和 / 中。这是一个例子:

(...)
alpha__w = (wave__w - central_w_par*doppler_factor)/sig_par
e1__w = np.exp(-.5*(alpha__w**2))
Y1__w = norm*e1__w/(sig_par*(2*np.pi)**.5)
(...)
于 2019-09-21T02:25:32.480 回答