345

我有一个 Python 函数,它需要几个参数。在某些情况下可以省略其中一些参数。

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

参数dthroughh是字符串,每个都有不同的含义。重要的是,我可以选择以任意组合传递哪些可选参数。例如,(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]
4

6 回答 6

381

只需使用*args参数,它允许您在a,b,c. 您必须向 map 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

于 2012-03-02T20:35:13.093 回答
275

试着这样称呼它:obj.some_function( '1', 2, '3', g="foo", h="bar" ). 在所需的位置参数之后,您可以按名称指定特定的可选参数。

于 2012-03-02T20:32:31.200 回答
36

这样做很容易

def foo(a = None):
       print(a)

如果没有参数,您可以键入任何应该在适当位置的内容而不是 None,例如,如果您不会像这样写入参数的值,foo()那么它将打印 None,因为没有给出参数,并且如果您会给它一个像foo("hello world")then这样的参数它会打印hello world,哦,是的,我忘了告诉你们,当这些类型的参数即可选参数时,这些参数需要遵循默认参数这意味着,让我们使用前一个函数并添加另一个参数b

def foo(a = None, b): 
    print(a)

现在,如果你要执行你的 python 文件,它会引发一个异常,说Non-default arguments follows default arguments

SyntaxError: non-default argument follows default argument

所以你必须把可选或非默认参数放在所需的参数之后

意思是

def foo (a, b=None): ... #This one is right(these threee dots are ellipsis which are somewhat like pass

def foo(b=None, a): ... #and this isn't
于 2021-04-15T06:36:44.517 回答
4

以更恰当的方式:

import Optional from typing

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

这等于:

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

欲了解更多信息: https ://docs.python.org/3/library/typing.html#typing.Optional

于 2021-11-17T10:12:08.077 回答
4

必需参数在前,可选参数在后。可选参数始终带有=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")
于 2022-01-14T12:26:47.877 回答
0

为了更好地了解传递参数时可能发生的情况,参考各种选项非常有帮助:位置或关键字(argarg="default_value")、仅位置(/,在参数列表中之前)、仅关键字(*,在参数列表中之后) )、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
于 2022-03-04T13:17:25.797 回答