web-dev-qa-db-ja.com

Pythonでの**の名前は何ですか?

プログラミング時Python変換を実行するために**を実行することがあります。その機能は理解していますが、どのデータ構造を操作しているのですか?dictとは何ですか?その他?array**演算子の名前はありますか?

59
Niklas

それ自体は演算子ではないため、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()によって理解されるため、引数のアンパックに使用できます。

86
Stefano Palazzo

名前はないと思います。 「引数リストの解凍」の下にある 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 !
_

参照: * argsおよび** kwargsの意味?

13
Kris Harper

特定の演算子の呼び出し先がわからない場合、または名前が付けられていない場合は、参照先として Waka Waka Bang Splat をいつでも参照できます。この場合、**と呼んでいますdouble-splat、ただしいくつかの シンボルの代替名 があります。

3
aculich