1

私は勉強して*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)

*これらの定義は、その後にキーワード引数が必要なため意味がありません。

そのため、この件に関する説明をいただければ幸いです。何が恋しいですか?それとも、上記の BNF は正しくないのでしょうか?

4

1 に答える 1

4

あなたが見ている文法の部分は、関数呼び出しについて説明しています。そして、関数呼び出しでは裸*は実際には無効です。

関数定義の文法は、言語リファレンスの別の部分にあります。これらの作品は関連しています:

parameter_list ::=  (defparameter ",")*
                    ( "*" [parameter] ("," defparameter)* ["," "**" parameter]
                    | "**" parameter
                    | defparameter [","] )
parameter      ::=  identifier [":" expression]
defparameter   ::=  parameter ["=" expression]

ここで、parameterdefparametersはオプションであり、 の後にあることに注意してください*

文句を言い、文法に由来def f(*)def f(*, **kwds)ないエラー。文法に関する限り合法であり、正常に解析されます。AST の生成中にのみ、これが検出され、エラーとしてフラグが立てられます。文法で処理されない構文上の制約はこれだけではありません。

于 2013-07-10T23:08:19.670 に答える