Tha*_*lia 162 python arguments function optional-arguments
我有一个Python函数,它需要几个参数.在某些情况下,可以省略其中一些参数.
def some_function (self, a, b, c, d = None, e = None, f = None, g = None, h = None):
#code
Run Code Online (Sandbox Code Playgroud)
这些参数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]
Run Code Online (Sandbox Code Playgroud)
Nix*_*Nix 187
只需使用*args参数,它允许您在您之后传递任意数量的参数 a,b,c.你必须添加一些逻辑来映射args-> c,d,e,f但它是一种重载的"方式".
def myfunc(a,b, *args, **kwargs):
for ar in args:
print ar
myfunc(a,b,c,d,e,f)
Run Code Online (Sandbox Code Playgroud)
它会打印出来 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', ...)
Run Code Online (Sandbox Code Playgroud)
然后kwargs会有一个字典,其中包含所有关键值的参数 a,b
Avi*_*ión 25
必需参数在前,可选参数在后。可选参数始终带有=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")
Run Code Online (Sandbox Code Playgroud)
PYC*_*PYC 16
这样做很容易
def foo(a = None):
print(a)
Run Code Online (Sandbox Code Playgroud)
如果没有参数,您可以输入任何应该到位的内容,而不是 None,例如,如果您不会像这样写入参数的值,foo()那么它将打印 None 因为没有给出参数,如果您将给它一个参数,foo("hello world")那么它会打印hello world,哦,是的,我忘了告诉大家,当这些类型的参数即可选参数时,这些参数需要遵循默认参数,这意味着,让我们使用前一个函数并添加另一个参数b
def foo(a = None, b):
print(a)
Run Code Online (Sandbox Code Playgroud)
现在,如果你要执行你的 python 文件,它会引发一个异常,说Non-default arguments follows default arguments,
SyntaxError: non-default argument follows default argument
Run Code Online (Sandbox Code Playgroud)
所以你必须把可选的或非默认的参数放在需要的参数之后
意思是
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
Run Code Online (Sandbox Code Playgroud)
cem*_*cem 16
检查一下:
from typing import Optional
def foo(a: str, b: Optional[str] = None) -> str or None:
pass
Run Code Online (Sandbox Code Playgroud)