プログラミング時Python変換を実行するために**
を実行することがあります。その機能は理解していますが、どのデータ構造を操作しているのですか?dict
とは何ですか?その他?array
?**
演算子の名前はありますか?
それ自体は演算子ではないため、reallyという名前はありませんが、 「構文規則」として定義されています です。だからそれは呼ばれるべきです:
引数のリストがある場合、_*args
_は、 "argument unpacking"と呼ばれ、同じ方法で_**kwargs
_が呼び出されます。 "キーワード引数の解凍"。
_=
_のように、_a, *middle, end = my_Tuple
_の左側で使用すると、 "Tuple unpacking"。
合計で、3つのタイプの(単一パラメーター)引数があります。
_def f(x) # x: positional argument
def f(x, y=0) # y: keyword argument
def f(x, *xs, y=0) # y: keyword-only argument
_
_*args
_引数は「可変位置パラメータ」と呼ばれ、_**kwargs
_は「可変キーワードパラメータ」です。可変位置パラメーターは、渡すすべての引数を取るため、キーワードのみの引数を定位置に指定することはできません。
これのほとんどは、PEP 62 および 102 のほか、ドキュメントの Control Flow セクションにあります。ただし、関数署名オブジェクトPEPは単なるドラフトであり、用語は1人の考えにすぎない場合があることに注意してください。しかし、彼らはとにかく良い条件です。 :)
したがって、_*
_および_**
_引数は、それぞれのデータ構造をアンパックするだけです。
_args = (1, 2, 3) # usually a Tuple, always an iterable[1]
f(*args) → f(1, 2, 3)
# and
kwargs = {"a": 1, "b": 2, "c": 3} # usually a dict, always a mapping*
f(**kwargs) -> f(a=1, b=2, c=3)
_
[1]:Iterableは__iter__()
メソッドを実装するオブジェクトであり、マッピングはkeys()
および__getitem__()
を実装するオブジェクトです。このプロトコルをサポートするすべてのオブジェクトは、コンストラクタTuple()
およびdict()
によって理解されるため、引数のアンパックに使用できます。
名前はないと思います。 「引数リストの解凍」の下にある Python Docs では、単に「_**
_-演算子」と呼ばれています。
「もう一方の」データ構造の意味がわかりません。 f(**kwargs)
を実行すると、辞書kwargs
をキーと値のペアのシーケンスとして解凍します。別の構造が関係しているとは思いません。
わかりやすくするために、上記のドキュメントの example をコピーします。
_>>> def parrot(voltage, state='a stiff', action='voom'):
... print "-- This parrot wouldn't", action,
... print "if you put", voltage, "volts through it.",
... print "E's", state, "!"
...
>>> d = {"voltage": "four million", "state": "bleedin' demised", "action": "VOOM"}
>>> parrot(**d)
-- This parrot wouldn't VOOM if you put four million volts through it. E's bleedin' demised !
_
特定の演算子の呼び出し先がわからない場合、または名前が付けられていない場合は、参照先として Waka Waka Bang Splat をいつでも参照できます。この場合、**
と呼んでいますdouble-splat
、ただしいくつかの シンボルの代替名 があります。