我有一个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之后的键值
很简单,只要这么做
def foo(a = None):
print(a)
Instead of None you can type anything that should be in place if there was no argument for example if you will not write the value of the parameter like this foo() then it will print None because no argument is given and if you will GIVE it an argument like foo("hello world") then it will print hello world... oh well I just forgot to tell y'all that these types of parameters i.e optional parameters, need to be behind all the other parameters. This means that, let's take the previous function and add another parameter b
def foo(a = None, b):
print(a)
现在如果你要执行你的python文件它会引发一个异常说非默认参数跟在默认参数后面,
SyntaxError: non-default argument follows default argument
所以你要把可选或非默认参数放在必选参数之后
这意味着
def foo (a, b=None): ... #This one is right
def foo(b=None, a): ... #and this isn't