我有一个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]

当前回答

为了更好地理解在传递参数时可能发生的事情,参考各种选项是很有帮助的:position -or-keyword (arg or arg="default_value"), position -only(在/之前,在参数列表中),keyword-only(在*之后,在参数列表中),var-positional(通常是*args)或var-keyword(通常是**kwargs)。请参阅Python文档以获得优秀的摘要;这个问题的其他各种答案利用了这些变化中的大多数。

因为在你的例子中你总是有参数a, b, c,并且你以一种位置的方式调用它们,你可以通过添加/,,

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

其他回答

只要使用*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之后的键值

试着像这样调用它:obj。Some_function ('1', 2, '3', g="foo", h="bar")。在必需的位置参数之后,可以通过名称指定特定的可选参数。

很简单,只要这么做

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

先选必填参数,后选参数。可选参数总是带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")

检查:

from typing import Optional

def foo(a: str, b: Optional[str] = None) -> str or None:
    pass