我有一个函数,该函数使用kwarg调用另一个函数以确定是否应调用它:
def a(val):
print(val)
def caller(func, call_it=True, *args, **kwargs):
if call_it:
func(*args, **kwargs)
# doesnt work
caller(a, 1)
# works
caller(a, True, 1)
在call_it
参数具有默认值但仍需要* args的情况下如何处理?
答案 0 :(得分:5)
否,关键字参数不能在普通参数之前。有效签名为caller(func, *args, call_it=True, **kwargs)
。
答案 1 :(得分:1)
不。函数签名看起来像:
def funcname(req_positional, *args, named_keyword, named_keyword_with_default=None, **kwargs):
# function body
例如,如果您不需要引用它们,则可以将其中的一些替换掉:
def funcname(a, b, c, *, must_be_a_keyword_argument):
pass
>>> funcname(1, 2, 3, 4)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: funcname() takes 3 positional arguments but 4 were given
>>> funcname(1, 2, 3, must_be_a_keyword_argument=4)
>>>
有关更正式的说明,请参见official documentation
答案 2 :(得分:0)
您需要将功能签名更改为
def caller(func, *args, call_it=True, **kwargs):
...