Python 使用参数名时的代码样式

Python 使用参数名时的代码样式,python,arguments,pep8,Python,Arguments,Pep8,参数名称的推荐样式是什么 open(file='myfile.txt') 或 没有提到这件事。我什么时候用一个还是另一个?你会得到不同的意见。就我个人而言,我认为尽可能使用关键字参数绝对更好,因为它将人类可读的语义附加到函数调用。读者可以在不进一步检查代码/文档的情况下猜出参数应该是什么 但是,在使用知名函数时,我有时会省略关键字。使用显式名称的主要好处是修改函数的签名对依赖它的代码的影响较小 例如,假设您正在使用模块的函数,定义为: their_function(a, b, c=1) 您通

参数名称的推荐样式是什么

open(file='myfile.txt')


没有提到这件事。我什么时候用一个还是另一个?

你会得到不同的意见。就我个人而言,我认为尽可能使用关键字参数绝对更好,因为它将人类可读的语义附加到函数调用。读者可以在不进一步检查代码/文档的情况下猜出参数应该是什么


但是,在使用知名函数时,我有时会省略关键字。

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

例如,假设您正在使用模块的函数,定义为:

their_function(a, b, c=1)
您通过以下方式使用
c
关键字参数调用它:

their_function(myA, myB, myC)
但是现在,模块的开发人员发现有另一个关键字参数很有用,而且在他们看来,它出现在
c
之前更有意义。 现在,函数是:

their_function(a, b, d=2, c=1)
无论你在哪里调用
他们的_函数(myA,myB,myC)
,现在
myC
作为
d
传递给
他们的_函数,一切都乱七八糟

另一方面,如果您通过
他们的_函数(myA,myB,c=myC)
调用它,关键字参数的映射将是这样的:
myC
将仍然作为
c
传递给
他们的_函数

当然,对于明显的函数,例如位置参数是自然的
print
open
来说,这可能有些过分。 但是我发现调用
open(path,'r',encoding='utf8')
,而不是
open(path,'r','utf8')
,这确实令人放心,因为即使我的顺序错误,行为也会如预期的那样


对于我来说,除了在少数情况下会违反直觉之外,我倾向于强制使用关键字参数的名称

Python 3在某些版本上允许您执行以下操作:

def my_function(a, b, *, c=1):
    pass
这里,仅使用splat操作符
*
就告诉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
>>我的功能(1)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:my_函数()缺少1个必需的位置参数:“b”
>>>my_函数(1,2)
#嗯
>>>my_函数(1、2、3)
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
TypeError:my_函数()接受2个位置参数,但给出了3个
>>>my_函数(1,2,c=3)
#嗯
这有助于使代码更简单,尤其是在定义具有许多位置参数或关键字参数的函数时

>>> 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