Недавно я изучал *args
и **kwargs
в python и обнаружил, что в python 3 можно использовать голый *
, как в примере из заголовка, чтобы указать, что после него не разрешены позиционные аргументы.
Проблема в том, что я не понимаю, как это соответствует формальному определению или «списку аргументов» по ссылке. Существует следующее определение списка аргументов:
argument_list ::= positional_arguments ["," keyword_arguments]
["," "*" expression] ["," keyword_arguments]
["," "**" expression]
| keyword_arguments ["," "*" expression]
["," keyword_arguments] ["," "**" expression]
| "*" expression ["," keyword_arguments] ["," "**" expression]
| "**" expression
Единственный способ, которым я вижу это, - это чтобы expression
было пустым, но я не мог понять, как это может произойти.
Если мы предполагаем, что expression
может быть пустым, то следующие определения должны быть действительными:
def foo(*)
def bar(*,**kwargs)
Эти определения не имеют смысла, так как *
требует аргументов ключевого слова после него.
Так что буду рад любым разъяснениям по теме. Что мне не хватает? Или приведенный выше БНФ не совсем корректен?