我正在开发一个几乎所有参数都通过密钥传递的项目。有些函数只有位置参数,有关键字(默认值)参数或两者的混合。例如以下函数:
def complete_task(activity_task, message=None, data=None):
pass
当前代码中的此函数将被调用如下:
complete_task(activity_task=activity_task, message="My massage", data=task_data)
对我来说,没有必要通过函数执行的上下文/变量名来命名名称明显的参数。我会这样称呼它:
complete_task(activity_task, "My message", task_data)
在某些情况下,不清楚调用参数来自上下文,或者从变量名称推断,我可能会这样做:
complete_task(activity_task, message="success", task_data=json_dump)
所以这让我想知道是否存在使用位置/关键字参数调用函数的约定或“pythonic”方式,当不需要重新排列方法参数或使用某些关键字参数的默认值时 / strong>即可。
答案 0 :(得分:4)
我遵循的通常的经验法则是:
if boolean_parameter: do_something(); else: do_something_entirely_different()
的整体结构。src
之前的dest
)。答案 1 :(得分:1)
Python有两种类型的参数 1 。 positional
和关键字(又名default
)。水有点混乱,因为位置参数可以通过关键字调用,关键字参数可以通过位置调用...
def foo(a, b=1):
print(a, b)
foo(1, 2)
foo(a=1, b=2)
话虽如此,我认为参数类型的 names 应该表明你应该(通常)如何使用它们。大多数时候,我看到由关键字调用的位置和关键字参数调用的位置参数。所以,如果你正在寻找一般的经验法则,我建议你让函数调用模仿签名。对于我们上面的foo
函数,我将其称之为:
foo(1, b=2)
我认为遵循这个建议的一个原因是因为(大多数时候),人们希望通过关键字传递关键字参数。因此,以后添加关键字的人并不常见:
def foo(a, aa='1', b=2):
print(a, aa, b)
如果您仅使用位置参数调用该函数,那么您现在将值传递给与以前不同的参数。但是,关键字参数并不关心您传递的顺序,因此您仍然应该全部设置。
到目前为止,这么好。但是,当你创建一个函数时,你应该使用什么规则?你怎么知道参数是default
参数还是positional
参数?这是一个合理的问题 - 很难找到一个好的经验法则。我使用的经验法则如下:
default
参数。如果用户没有提供特定的参数(因为没有好的默认值),该函数将失败,那么它应该是位置的。1 Python3.x还有关键字 only 参数。那些不能给你一个选择,所以我不知道他们在这里的讨论中添加太多了<- em> :-) - 虽然我不知道我&我#39;他们在野外看到了他们的使用太多了。