可以在关键字参数之后使用* args

时间:2020-08-01 00:58:24

标签: python

我有一个函数,该函数使用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的情况下如何处理?

3 个答案:

答案 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):
    ...