参数名称的推荐样式是什么?
open(file='myfile.txt')
或
open('myfile.txt')
PEP8 Style Guide For Python对此没有提及任何内容。我什么时候使用其中之一?
最佳答案
我看到使用显式名称的主要好处是函数签名的修改对依赖它的代码的影响较小。
例如,假设您正在使用模块的函数,定义为:
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
作为 d
传递给 their_function
>,一切都搞砸了。
另一方面,如果您通过 their_function(myA, myB, c=myC)
调用它,关键字参数的映射将是 myC
仍将作为 c
传递给 their_function
。
当然,这对于明显的函数来说可能有点矫枉过正,例如 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
这有助于让您的代码更简单一些,尤其是在定义具有许多位置参数或关键字参数的函数时。
关于python - 使用参数名称的代码风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46001182/