関数呼び出し中にキーと値のペアをkwargsに追加する方法はありますか?
def f(**kwargs):
print(kwargs)
# ...
pre_defined_kwargs = {'a': 1, 'b': 2}
f(**pre_defined_kwargs, c=3)
それとも既存の引数を変更しますか?
f(**pre_defined_kwargs, b=3) # replaces the earlier b=2
これらの2つの例は、エラーが発生するため機能しません
>>> f(**pre_defined_kwargs, c=3)
SyntaxError: invalid syntax
引数の間のコンマを指す
Pythonバージョン<3.5の場合、_**kwargs
_変数キーワード引数を配置する必要があります last :
_f(c=3, **pre_defined_kwargs)
_
Calls expression syntax ;を参照してください。文法のすべての形式で、_"**" expression
_ルールは last に配置されます。つまり、_**expression
_構文の後に何かを使用すると、構文エラーになります。
辞書を新しい値で更新する場合は、 dict()
callable ;を使用できます。既存のディクショナリおよびの更新キーのコピーを作成できます。ただし、キーも有効な場合Python識別子(文字またはアンダースコアで始まる) 、文字、数字、アンダースコアのみを含む):
_f(c=3, **dict(pre_defined_kwargs, b=42))
_
ここで_b=42
_は、_'b'
_キーの new 値を設定します。もちろん、これと同じ構文を使用してキーを追加することもできます。
_**expression
_マッピングと明示的に同じキーを使用することはできません。 TypeError
が発生します。ここでも、すでにリンクされているドキュメントから:
構文_
**expression
_が関数呼び出しにある場合、expression
はマッピングに評価される必要があり、その内容は追加のキーワード引数として扱われます。キーワードがexpression
と明示的なキーワード引数の両方にある場合、TypeError
例外が発生します。
デモ:
_>>> def f(**kwargs):
... print(kwargs)
...
>>> pre_defined_kwargs = {'a': 1, 'b': 2}
>>> f(c=3, **pre_defined_kwargs)
{'a': 1, 'c': 3, 'b': 2}
>>> dict(pre_defined_kwargs, b=42)
{'a': 1, 'b': 42}
>>> f(c=3, **dict(pre_defined_kwargs, b=42))
{'a': 1, 'c': 3, 'b': 42}
_
この制限は、Python 3.5の時点で解除されました( PEP-448-のおかげで、追加の解凍の一般化 にできます。引数タイプの順序を自由に組み合わせ、呼び出しで複数の_**mapping
_参照を使用する(個別のマッピングを使用)。キーワードは、適用されるすべての引数にわたって一意である必要があります。一度。
>>> f(c=3, **pre_defined_kwargs)
{'c': 3, 'a': 1, 'b': 2}