将参数传递给函数的pythonic方法是什么?

时间:2016-05-10 02:33:02

标签: python

我正在开发一个几乎所有参数都通过密钥传递的项目。有些函数只有位置参数,有关键字(默认值)参数或两者的混合。例如以下函数:

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>即可。

2 个答案:

答案 0 :(得分:4)

我遵循的通常的经验法则是:

  1. 布尔值,特别是布尔文字,应该总是通过关键字传递,除非它真的明显是什么意思。这很重要,我经常会在编写自己的函数时使用booleans关键字。如果你有一个布尔参数,你的函数可能希望被分成两个较小的函数,特别是如果它采用if boolean_parameter: do_something(); else: do_something_entirely_different()的整体结构。
  2. 如果一个函数需要很多可选参数(超过3个包括必需参数),那么通常应该通过关键字传递选项。但是如果你有很多参数,你的函数可能需要重构为多个较小的函数。
  3. 如果一个函数采用相同类型的多个参数,它们可能希望作为关键字参数传递,除非上下文中的顺序是完全明显的(例如src之前的dest)。
  4. 大多数时候,关键字参数没有错。如果你有一个位置参数令人困惑的情况,你应该使用关键字参数而不需要再考虑。除了简单的一个参数函数之外,关键字参数不会使您的代码任何更难来阅读。

答案 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参数?这是一个合理的问题 - 很难找到一个好的经验法则。我使用的经验法则如下:

  1. 与项目的其他部分保持一致 - 如果您正在做与周围其他代码不同的事情,那么很难做到正确。
  2. 如果(且仅当)可以提供合理的默认值,则将参数设为default参数。如果用户没有提供特定的参数(因为没有好的默认值),该函数将失败,那么它应该是位置的。
  3. 1 Python3.x还有关键字 only 参数。那些不能给你一个选择,所以我不知道他们在这里的讨论中添加太多了<- em> :-) - 虽然我不知道我&我#39;他们在野外看到了他们的使用太多了。