python - 使用参数名称的代码风格

标签 python arguments pep8

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

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

当然,这对于明显的函数来说可能有点矫枉过正,例如 printopen,其位置参数是自然的。 但我发现调用 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/

相关文章:

python - 关于限制行长度以符合 PEP8 的不同方式的样式的一些建议

python - Pandas:使用重复值进行透视

c - 如何在执行C文件时运行参数?

php - Python 扭曲渲染 PHP

r - 将 R Shiny 应用程序保存为函数,并将参数传递给 Shiny 的应用程序

Javascript 函数参数参数或全局变量

python - Pep8 E501 : line too long error

python - 根据 PEP 8 正确的换行格式?

python - 对 DRF 序列化程序上的 ManyToMany 和 OneToMany 字段使用自定义模型管理器

python - Pygame 鼠标点击 |在音乐播放中切换播放暂停