2017-09-01 44 views

回答

0

你会得到不同的意见。就我个人而言,我认为只要可能,使用关键字参数是严格更好,因为它将人类可读的语义附加到函数调用。读者可以在猜测参数应该是什么而不需要进一步检查代码/文档时有一个体面的注意。

但是,在使用众所周知的功能时,有时会省略关键字。

1

我在使用显式名称时看到的主要好处是对函数签名的修改对依赖它的代码的影响较小。

例如,假设你使用一个模块的功能,定义为:

their_function(a, b, c=1) 

你通过与c关键字参数调用它:

their_function(myA, myB, myC) 

但现在,该模块的开发人员发现有另一个关键字参数是有用的,在他们的想法中,它更有意义,它在c之前。 所以,现在的功能是:

their_function(a, b, d=2, c=1) 

到处打电话their_function(myA, myB, myC),现在myC传递给their_functiond,一切都搞砸了。

在另一方面,有您their_function(myA, myB, c=myC)称它的关键字参数映射会一直让myC会依然被传递到their_functionc

当然,这可能是矫枉过正的明显功能,如printopen其位置论证是自然的。 但我发现确实可以打电话给open(path, 'r', encoding='utf8'),而不是open(path, 'r', 'utf8'),因为即使我订购错误,行为仍会如预期。


对于我来说,除了在少数情况下,这将是反直觉,我倾向于强制使用的关键字参数的名称。

Python 3中,从一些版本,可以让你做到以下几点:

def my_function(a, b, *, c=1): 
    pass 

这里,使用图示操作*单独告诉Python没有位置参数可以在第三个之后被发现。 将第四个参数作为位置参数传递时,这将导致TypeError,即没有命名它。

>>> my_function(1) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: my_function() missing 1 required positional argument: 'b' 

>>> my_function(1, 2) 
# OK 

>>> my_function(1, 2, 3) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
TypeError: my_function() takes 2 positional arguments but 3 were given 

>>> my_function(1, 2, c=3) 
# OK 

这可以帮助你让你的代码更防呆,许多位置或关键字参数定义函数时尤其如此。