2012-01-13 72 views
66

为什么PEP 8 recommend not having spaces around = in a keyword argument or a default parameter valuePEP 8,为什么在关键字参数或默认参数值中'='没有空格?

是周围的=在Python代码其它每次出现,建议空间这个矛盾?

操作方法是:

func(1, 2, very_long_variable_name = another_very_long_variable_name) 

由Python的BDFL来讨论/解释的任何链接可以理解的:

func(1, 2, very_long_variable_name=another_very_long_variable_name) 

不是更好。

心灵,这个问题更多的是kwargs超过默认值,我只是用措辞从PEP 8

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

回答

47

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

例如,有大量的这样的代码:

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

正如你看到的,它使完全意义分配给恰好同名关键字参数变量,这样就可以增强可读性,看到他们没有空格。认识到我们正在使用关键字参数并且不为自己分配变量更容易。

而且,参数往往在同一行去,而任务通常是每个人在自己的线路,所以节省空间很可能是有一件重要的事情。

+3

这可能是这样,但还是觉得奇怪,引进代码风格建议这个IMO iconsistency这样一个精心设计的语言,仅保存2个字符。就好像java代码风格说在if语句之后的一个新行上放置'{''(保存相同数量的字符)',而不是类定义''是很容易的。此外,关键字参数与默认值不同,但仍使用相同的样式建议。 – soulcheck 2012-01-13 16:00:51

+2

正如我所说,他们是不同的东西。有区别地写它们是有意义的。 – fortran 2012-01-13 16:06:01

+5

我会说它比'kw1 = kw1,kw2 = kw2'更不可读);但也许这就是Guido和Barry所想的。 – soulcheck 2012-01-13 16:17:11

8

我不会用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 _...

+2

你说的(本质上):为了使无空间规则合理,写出非常短的变量名。但是如果一个人拥有很长的变量名,那么无空间规则就会造成混乱的环境。 “这不是一个任务,所以他们是不同的东西”这个论点并不适合我,因为我更关心可读性而不是关于语义,因为如果它不是'赋值的默认值',那么什么是它? – PatrickT 2016-06-23 19:23:51

+0

@PatrickT“它不是一个赋值,所以它们是不同的东西”没有任何解释_为什么它是(哲学概念);它仅仅解释了为什么它可以是(一个句法概念)。 – 2017-05-03 23:47:04

5

IMO留出的空间为ARGS提供ARG /值对清洁器视觉分组;它看起来不那么混乱。

+0

我通常喜欢空格,所以我倾向于将空格放在括号内,因此所有参数都被空格包围。但我认为'arg1 = 40'更具可读性,因为这种关系更为明显。 – 2016-04-22 22:28:16

3

我觉得有几个方面的原因,但我可能只是合理化:

  1. 它节省空间,让更多的函数定义和调用,以适应在一行,并节省更多的空间参数名称本身。
  2. 通过加入每个关键字和值,可以更容易地通过逗号后面的空格分隔不同的参数。这意味着您可以快速浏览您提供的参数。
  3. 语法然后不同于可能具有相同名称的变量赋值。
  4. 此外,语法是从等式(甚至更多个)不同的检查a == b它也可以是一个呼叫内有效表达式。
4

有利弊。

我很讨厌的代码如何PEP8兼容的读取。我不认为very_long_variable_name=another_very_long_variable_name可以比 very_long_variable_name = another_very_long_variable_name更具人类可读性。 这不是人们阅读的方式。这是额外的认知负担,特别是在没有语法突出显示的情况下。

有一个显著的好处,但是。如果间距规则得到遵守,这让搜索专门使用工具更有效的参数。