如何使用可选参数创建Python函数?


218

我有一个带几个参数的Python函数。在某些情况下,可以忽略其中一些参数。

def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
    #code

这些参数d通过h是字符串,每个都有不同的含义。我可以选择要以任何组合形式传递的可选参数,这一点很重要。例如,(a, b, C, d, e)(a, b, C, g, h),,或(a, b, C, d, e, f,或所有它们(这些是我的选择)。

如果我可以重载该函数,那就太好了-但我读到Python不支持重载。我试图在列表中插入一些必需的int参数-并收到参数不匹配错误。

现在,我正在发送空字符串来代替前几个缺少的参数作为占位符。我希望能够仅使用实际值来调用函数。

有什么办法吗?我可以传递一个列表而不是参数列表吗?

现在,使用ctypes的原型看起来像:

_fdll.some_function.argtypes = [c_void_p, c_char_p, c_int, c_char_p, c_char_p, c_char_p, c_char_p, c_char_p]

Answers:



244

只需使用*args参数,它可以让您在后面传递任意数量的参数a,b,c。您将不得不在映射中添加一些逻辑args-> c,d,e,f但它是过载的“方式”。

def myfunc(a,b, *args, **kwargs):
   for ar in args:
      print ar
myfunc(a,b,c,d,e,f)

它会打印出 c,d,e,f


同样,您可以使用kwargs参数,然后可以命名参数。

def myfunc(a,b, *args, **kwargs):
      c = kwargs.get('c', None)
      d = kwargs.get('d', None)
      #etc
myfunc(a,b, c='nick', d='dog', ...)

然后kwargs将有一个字典,其中包含所有在之后被键值的参数a,b


谢谢。虽然我不能在代码中使用这么多的灵活性,也不能解决列表中有多个空洞的调用问题,但它是在不同项目中使用的出色工具。拉塞尔·博罗戈夫(Russel Borogove)给了我解决问题所需的确切答案,我很高兴。
塔利亚(Thalia)2012年

12

@Nix,我真的很喜欢你的答案。但是,能否请您说明该语句c = kwargs.get('c', None)的用途?每个具有可选参数的函数都需要它吗?在您的代码中,您只有2个可选的参数。如果用户要另一个参数说e怎么办?我怎样才能改变任何未知数量的可选参数的个数示例代码,为前:def my_func(a, b, *args, **kwagars): obj = <do something with a & b> obj.add(c) obj.add(d) continue obj.add(for e, f, g...)?我必须包括c = kwargs.get('c', None) etc在做之前obj.add(c, d, ...)
Nemo

如果您担心时间复杂性。这将是一个问题
NduJay
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.