问题:如何使用可选参数创建Python函数?
我有一个带几个参数的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]
回答 0
尝试像这样调用它:obj.some_function( '1', 2, '3', g="foo", h="bar" )
。在所需的位置参数之后,可以按名称指定特定的可选参数。
回答 1
只需使用*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