我有一个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]
先选必填参数,后选参数。可选参数总是带a =None。
简单快捷的例子:
def example_function(param1, param2, param3=None, param4=None):
pass
# Doesn't work, param2 missing
example_function("hello")
# Works
example_function("hello", "bye")
# Works. Both the same
example_function("hello", "bye", "hey")
example_function("hello", "bye", param3="hey")
# Works. Both the same
example_function("hello", "bye", "hey", "foo")
example_function("hello", "bye", param3="hey", param4="foo")
只要使用*args参数,它允许你在a,b,c之后传递尽可能多的参数。你必须添加一些逻辑映射参数->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之后的键值