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

当前回答

检查:

from typing import Optional

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

其他回答

很简单,只要这么做

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

为了使Avión的答案适用于矢量参数输入;

def test(M,v=None):
    try: 
        if (v==None).all() == False:
            print('argument passed')
            return M + v 
    except: 
        print('no argument passed')
        return M 

其中M是某个矩阵,v是某个向量。当我试图使用if语句而不使用'try/ except'语句时,test(M)和test(M,v)都会产生错误。

正如cem所提到的,升级到python 3.10将允许union (x|y)(或Optional[…])功能,这可能会为其他方法打开一些大门,但我使用的是Anaconda spyder,所以我想我必须等待一个新的版本才能使用python 3.10。

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

检查:

from typing import Optional

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

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