PEP 8,为什么在关键字参数或默认参数值周围不加空格?

150 投票
7 回答
57825 浏览
提问于 2025-04-17 10:11

为什么PEP 8建议在关键字参数或默认参数值的=周围不要加空格呢?

这和在Python代码中其他地方使用=时推荐加空格的做法是不是有点矛盾?

比如说:

func(1, 2, very_long_variable_name=another_very_long_variable_name)

这样比:

func(1, 2, very_long_variable_name = another_very_long_variable_name)

要好在哪里呢?

如果有关于这个问题的讨论或解释的链接,尤其是来自Python的BDFL的,我会很感激。

请注意,这个问题主要是关于关键字参数,而不是默认值,我只是用了PEP 8中的说法。

我不是在征求意见。我是在问这个决定背后的原因。更像是在问为什么我在C程序中会把{放在if语句的同一行,而不是是否应该这样做。

7 个回答

19

我不会把很长的变量名用作默认参数。你可以考虑这样写:

func(1, 2, axis='x', angle=90, size=450, name='foo bar')

而不是这样:

func(1, 2, axis = 'x', angle = 90, size = 450, name = 'foo bar')

另外,把变量当作默认值用也没什么太大意义。也许可以用一些常量变量(虽然它们其实并不是真正的常量),在这种情况下,我会用全大写的名字,尽量简短且描述性强。所以不要再用另一个很长的名字了……

33

这件事有好有坏。

我非常不喜欢PEP8规范的代码阅读起来的感觉。我不认同那种说法,认为very_long_variable_name=another_very_long_variable_namevery_long_variable_name = another_very_long_variable_name更容易让人看懂。人们并不是这样阅读的,这样的写法增加了额外的思考负担,尤其是在没有语法高亮的情况下。

不过,遵循这些空格规则确实有一个很大的好处。如果大家都按照这些规则来写代码,那么用工具搜索参数时会变得更加有效。

93

我想这主要是因为关键字参数和变量赋值本质上是不同的东西。

比如,代码中经常会看到这样的写法:

kw1 = some_value
kw2 = some_value
kw3 = some_value
some_func(
    1,
    2,
    kw1=kw1,
    kw2=kw2,
    kw3=kw3)

正如你所看到的,把一个变量赋值给一个名字完全相同的关键字参数是很合理的,这样做可以提高代码的可读性,因为它们没有空格。这样更容易让人明白我们是在使用关键字参数,而不是把变量赋值给它自己。

另外,参数通常会在同一行,而赋值一般每个都会单独占一行,所以在这里节省空间可能是个重要的考虑。

撰写回答