web-dev-qa-db-ja.com

関数呼び出し中にパラメーターをkwargsに追加しますか?

関数呼び出し中にキーと値のペアを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

引数の間のコンマを指す

20
Markus Meskanen

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_参照を使用する(個別のマッピングを使用)。キーワードは、適用されるすべての引数にわたって一意である必要があります。一度。

32
Martijn Pieters
>>> f(c=3, **pre_defined_kwargs)
{'c': 3, 'a': 1, 'b': 2}
2
dm03514