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

How do I create a Python function with optional arguments?

我有一个python函数,它接受几个参数。在某些场景中,可以忽略其中一些参数。

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

dh的参数是字符串,每个字符串都有不同的含义。重要的是,我可以选择在任何组合中传递哪些可选参数。例如,(a, b, C, d, e)(a, b, C, g, h)(a, b, C, d, e, f或全部(这些是我的选择)。

如果我能重载这个函数,那就太好了——但是我读到python不支持重载。我试图在列表中插入一些必需的int参数,但得到了一个参数不匹配错误。

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

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

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

1
_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]


只需使用*args参数,它允许您在a,b,c之后传递任意数量的参数。您必须添加一些逻辑来映射args->c、d、e、f,但这是一种重载的"方式"。

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

它将打印c,d,e,f

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

1
2
3
4
5
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之后的所有关键值参数。


试着这样称呼它:obj.some_function( '1', 2, '3', g="foo", h="bar" )。在必需的位置参数之后,可以按名称指定特定的可选参数。