Можно ли использовать * args после аргумента ключевого слова - PullRequest
1 голос
/ 01 августа 2020

У меня есть функция, которая вызывает другую функцию с помощью 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 имеет значение по умолчанию, а * аргументы еще нужен?

Ответы [ 3 ]

5 голосов
/ 01 августа 2020

Нет, аргументы ключевого слова не могут предшествовать обычным аргументам. Допустимая подпись будет caller(func, *args, call_it=True, **kwargs).

.
1 голос
/ 01 августа 2020

Нет. Сигнатура функции выглядит так:

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)
>>>

См. официальный документация для более формального описания

0 голосов
/ 01 августа 2020

Вам нужно изменить подпись функции на

def caller(func, *args, call_it=True, **kwargs):
    ...
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...