Python中位运算符的风格

3 投票
2 回答
615 浏览
提问于 2025-04-17 14:39

我在PEP文档中找不到关于位运算符(|,&)的样式信息,特别是在这段代码中:

class MySplashScreen(wx.SplashScreen):
    def __init__(self, parent=None):
        wx.SplashScreen.__init__(self, logo.getBitmap(), wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT, 2000, parent)

在这种情况下(wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT),我应该使用空格吗?

2 个回答

2

我肯定会在变量或常量名称的两边加上空格。否则的话,中间的|就很难看得出来了。

1

如果要找这个内容,可以去查看PEP 8中的表达式中的空格部分。不过,这里没有提到这些运算符:

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

我觉得这样做是有道理的。比如在 wx.SPLASH_CENTRE_ON_SCREEN | wx.SPLASH_TIMEOUT 中,你几乎肯定想要空格,但在 a|b 中我就不太确定你是否想要空格。实际上,像 a&b | c&d 这样的表达式,跟推荐的 x*x + y*y 似乎很相似。

你想在这里加空格,跟运算符 | 没关系,而是因为值是 wx.SPLASH_CENTRE_ON_SCREEN。其实,我觉得在 BIG_LONG_CONSTANT_1 + BIG_LONG_CONSTANT_2 中你也会做出同样的决定。所以,也许在风格指南中应该增加一个关于当操作数是难看的大写常量时,运算符周围的空格的额外规则。

不过,暂时我觉得没有必要对位运算符有特别的规则。就像对待算术运算符一样对待它们就可以了。(而且要注意,关于是否在运算符周围加空格,比如 +,并没有具体的规则,除非在同一个表达式中使用了优先级不同的运算符。实际上,在PEP8中你会看到这两种写法都有。这意味着一般来说两种方式都是可以接受的,具体情况需要你自己判断。)

话虽如此,风格检查工具 pep8 会把没有空格的位运算符和算术运算符标记为E225。它甚至会把像 x = x/2 - 1 这样的“不同优先级”的例子(PEP 8认为这是“好的”)标记为可选的E226警告。详细信息可以查看missing_whitespace_around_operator。我觉得这并不算什么官方认可,但“我在这里加了空格是为了让代码通过我们为这个项目选择的风格检查器”是一个相当合理的理由。(不过你可能想看看其他工具,比如 pep8ify,以及 pylintpyflakes 等等对这个话题有什么看法。)

撰写回答