args構文を使用する引数リストで、最後のカンマがSyntaxErrorになるのはなぜですか?
2023-12-09 08:39:37
質問
で末尾にコンマを使用できないのはなぜですか?
*args
を使うことができないのでしょうか? 言い換えれば、これは動作します
>>> f(1, 2, b=4,)
しかし、これでは
>>> f(*(1, 2), b=4,)
File "<stdin>", line 1
f(*(1, 2), b=4,)
^
SyntaxError: invalid syntax
これはPython2でもPython3でも同じです。
どのように解決するのですか?
を見てみましょう。 言語仕様 :
call ::= primary "(" [argument_list [","]
| expression genexpr_for] ")"
argument_list ::= positional_arguments ["," keyword_arguments]
["," "*" expression] ["," keyword_arguments]
["," "**" expression]
| keyword_arguments ["," "*" expression]
["," "**" expression]
| "*" expression ["," "*" expression] ["," "**" expression]
| "**" expression
positional_arguments ::= expression ("," expression)*
keyword_arguments ::= keyword_item ("," keyword_item)*
keyword_item ::= identifier "=" expression
気になる部分までふるい落とそう。
call ::= primary "(" [argument_list [","]] ")"
argument_list ::= positional_arguments ["," keyword_arguments]
["," "*" expression] ["," keyword_arguments]
["," "**" expression]
positional_arguments ::= expression ("," expression)*
keyword_arguments ::= keyword_item ("," keyword_item)*
keyword_item ::= identifier "=" expression
ということは、関数呼び出しの引数の後に、追加で
,
. これはcpythonの実装のバグのように見えます。
のようなものです。
f(1, *(2,3,4), )
のようなものは、この文法に従えば動作するはずですが、CPythonではそうではありません。
以前の回答で エリック がリンクしていた CPython文法仕様 にリンクされており、上記の文法のCPythonの実装が含まれています。以下、それを紹介します。
arglist: (argument ',')* ( argument [',']
| '*' test (',' argument)* [',' '**' test]
| '**' test
)
なお、この文法は ではありません。 であることに注意してください。私はこれを実装上のバグと考えます。
CPythonの実装には、さらに問題があることに注意してください。これもサポートされるべきです。
f(*(1,2,3), *(4,5,6))
しかし奇妙なことに、この仕様では
f(*(1,2,3), *(4,5,6), *(7,8,9))
もっと見ていくと
仕様のこの部分を修正する必要があると思います。これは許される。
f(x=1, *(2,3))
, しかし、これは許されない。
f(x=1, 2, 3)
.
また、元の質問の参考になるかもしれませんが、CPythonでは
*args
または
**kwargs
という機能があります。これがダサいというのは同感です。
関連
-
[解決済み] JavaScriptで "use strict "は何をするのか、その根拠は?
-
[解決済み] PandasでDataFrameの行を反復処理する方法
-
[解決済み] 最小限の驚き」と「変更可能なデフォルトの引数
-
[解決済み] Python 3で「1000000000000000 in range(1000000000000001)」はなぜ速いのですか?
-
[解決済み] モジュールの関数名(文字列)を使って、モジュールの関数を呼び出す。
-
[解決済み] なぜC++はPythonよりもstdinからの行の読み込みが遅いのですか?
-
[解決済み] Pythonのswitch文の代用品?
-
[解決済み] 最近のPythonでカスタム例外を宣言する適切な方法?
-
[解決済み] 億の相対的輸入
-
[解決済み] Pythonのsuper()は多重継承でどう動くのか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Jupyterノートブックでenv変数を設定する方法
-
[解決済み] SQLAlchemy: セッションの作成と再利用
-
[解決済み] PythonでファイルのMD5チェックサムを計算するには?重複
-
[解決済み] 値で列挙名を取得する [重複]。
-
[解決済み] PyMongoで.sortを使用する
-
[解決済み] あるオブジェクトが数であるかどうかを確認する、最もパイソン的な方法は何でしょうか?
-
[解決済み] Django で全てのリクエストヘッダを取得するにはどうすれば良いですか?
-
[解決済み] PyQtアプリケーションのスレッド化。QtスレッドとPythonスレッドのどちらを使うか?
-
[解決済み] CSVデータを処理する際、1行目のデータを無視する方法を教えてください。
-
[解決済み] virtualenv の `--no-site-packages` オプションを元に戻す。