PEP 8,为什么关键字参数或默认参数值的'='周围没有空格?


103

为什么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与讨论/解释的任何链接将不胜感激。

请注意,这个问题更多的是关于kwargs而不是默认值,我只是使用了PEP 8中的措词。

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

Answers:


72

我猜这是因为关键字参数与变量赋值本质上是不同的。

例如,有很多这样的代码:

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

如您所见,将变量分配给名称完全相同的关键字参数是完全有意义的,因此可以提高可读性,使它们看不到空格。更容易认识到我们正在使用关键字参数,而不是为其本身分配变量。

同样,参数往往在同一行中,而赋值通常每个都在各自的行中,因此节省空间可能是一个重要问题。


6
可能是这样,但是在这种样式良好的语言的代码样式建议中引入此IMO图标集仍然很奇怪,仅节省2个字符。好像Java代码样式说{if(定义相同的字符数之后)换行但不要在类定义中插入新行是个好主意。关键字参数也不同于默认值,但仍使用相同的样式建议。
soulcheck 2012年

3
如我所说,它们是不同的东西。用不同的方式写它们是有意义的。
fortran 2012年

6
我会说它不是比kw1 = kw1, kw2 = kw2;)更具可读性,但也许那正是Guido和Barry的想法。
soulcheck 2012年

1
我会接受这个答案,因为它非常有说服力。不会介意通过链接进行确认
soulcheck 2012年

5
关键字参数与变量赋值从根本上不同的事实对于具有不同的IMO约定不是有效的参数,因为从上下文中已经可以明显看出差异。前者发生函数调用中,而后者需要在当前缩进级别独立存在。IMO,对于长度超过5-6个字符的变量名(即大多数情况下为现实生活),带空格的变体更加易于阅读。
Axel

13

我不会使用very_long_variable_name作为默认参数。所以考虑一下:

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

在此:

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

同样,将变量用作默认值也没有多大意义。也许某些常量变量(实际上不是常量),在这种情况下,我将使用全为大写的名称,以描述性的方式表示,但尽可能简短。所以没有another_very _...


1
这些是关键字参数,PEP中的一个类似示例只是使它的可读性较差
soulcheck

3
您实际上是在说:要使无空间规则更合理,请编写非常简短的变量名。但是,如果一个变量名很长,那么无空间规则会导致混乱的环境。“这不是一个赋值,所以它们是不同的事情”这一论点对我来说是没有用的,因为我更关心易读性而不是语义,并且如果它不是“赋值的默认值”,那它?
PatrickT

1
@PatrickT“这不是一项任务,因此它们是不同的事情”这一论点并不能解释为什么它是(一种哲学概念);它仅说明了为什么可以(语法概念)。
Mateen Ulhaq '17

11

有优点也有缺点。

我非常不喜欢PPE8兼容代码的读取方式。我不very_long_variable_name=another_very_long_variable_name接受比人类更具可读性 的论点very_long_variable_name = another_very_long_variable_name。人们不是这样阅读的。这是额外的认知负担,尤其是在没有语法突出显示的情况下。

但是,这有很大的好处。如果遵守间隔规则,则使使用工具专门搜索参数更加有效。


好吧,如果您坚持在=周围放置空格,那么使用工具进行搜索应该没有什么不同。
NoName

10

IMO省略了用于args的空间,从而提供了更清晰的arg / value对可视分组。看起来不那么混乱。


我通常喜欢空格,因此我也倾向于在括号内放空格,因此所有参数都被空格包围。但是我确实认为该arg1=40方法更具可读性,因为这种关系更加明显。
Charlie Gorichanaz '16

3

我认为有几个原因,尽管我可能只是在进行合理化:

  1. 它节省了空间,允许更多的函数定义和调用适合一行,并为参数名称本身节省了更多空间。
  2. 通过将每个关键字和值连接在一起,可以更轻松地用逗号后的空格分隔不同的参数。这意味着您可以快速查看提供的参数数量。
  3. 这样,语法便与可能具有相同名称的变量分配不同。
  4. 此外,该语法(甚至更多)不同于相等检查a == b,相等检查也可以是调用内的有效表达式。

3

对我来说,它使代码更具可读性,因此是一个很好的约定。

我认为变量分配和函数关键字分配在样式方面的主要区别在于=,前者在一行上应该只有一个,而通常有多个=

如果没有其他考虑,我们宁愿foo = 42使用foo=42,因为后者不是等号通常的格式,并且因为前者在视觉上很好地用空格分隔了变量和值。

但是,当有一行中的多个任务,我们更f(foo=42, bar=43, baz=44)f(foo = 42, bar = 43, baz = 44),因为前者在视觉上与分离空白的几个任务,而后者则没有,使得它有点难以看到的关键字/值对。

这里是把它的另一种方式:还有就是约定背后的一致性。一致性是这样的:通过空格使“最高分离级别”在视觉上更加清晰。较低级别的分隔不是(因为它将与分隔较高级别的空白混淆)。对于变量分配,最高的分隔级别是变量和值之间。对于功能关键字分配,最高的分隔级别是各个分配本身之间的分隔。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.