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


59

Pythonをプログラミングするとき**、変換を行うためにaを行うことがあります。私はそれが何をするのか理解していますが、どのデータ構造を操作していますか?A dictと他のものは何ですか?array**オペレーターの名前はありますか?


3
指数演算子?
ルーク

12
には2つの意味があります**。パワーと「キーワード引数辞書」。あなたはどちらについて話しているのですか?ドキュメントには次の単語があります。「「** identifier」という形式が存在する場合、余分なキーワード引数を受け取る新しい辞書に初期化され、デフォルトでは新しい空の辞書になります。」どれがあなたの質問に関連すると思われますか?
-S.Lott

「キーワード引数辞書」は私が尋ねているものです。コメントありがとうございます。
ニクラスローゼンクランツ

回答:


86

それ自体は演算子ではないため、実際には名前はありませ、「構文規則」として定義されています。だからそれは呼ばれるべきです:

  • 「キーワード引数のアンパック構文」

引数のリストがある場合は、「引数のアンパック」*argsと呼ばれ、同じ方法で「キーワードの引数のアンパック」と呼ばれます。**kwargs

のようにの左側で使用する場合=a, *middle, end = my_tuple「タプルの解凍」と言います。

合計で、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 0362および3102にあり、ドキュメントの制御フローセクションにもあります。ただし、関数署名オブジェクト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]:イテラブルはメソッドを実装するオブジェクトで__iter__()あり、マッピングはkeys()およびを実装するオブジェクトです__getitem__()。このプロトコルをサポートするオブジェクトは、コンストラクターtuple()とによって理解されるdict()ため、引数のアンパックに使用できます。


3
他の誰かが混乱している場合、def f(x, *xs, y=0): pass有効なPython 2. {5,6,7}構文ではなく、def f(x, y=0, *xs):期待どおりの動作をしません。私の知る限り、(明らかに)意図した効果を達成する唯一の方法はdef f(x, *xs, **kw): y=kw.get('y', 0); del kw; ...です。Python 3は元の構文を期待どおりに処理します。
chbrown

1
現在begin, *middle, end = (0, 1, 2, 3, 4, 5)、Python 2.xでも構文は機能していません。
ステファノパラッツォ

Python 3.5以降では、この答えは正しくありません。PEP-448は、**演算子を辞書のアンパック演算子として指定します。参照してくださいpython.org/dev/peps/pep-0448
devnul3

13

名前があるとは思わない。「引数リストのアンパック」の下のPythonドキュメントでは、「**-演算子」と呼ばれています。

「他の」データ構造の意味がわかりません。行うときは、キーと値のペアのシーケンスとしてf(**kwargs)辞書をアンパックしますkwargs。別の構造が関与していることはわかりません。

わかりやすくするために、上記のドキュメントのをコピーします。

>>> 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はどういう意味ですか?


読者が解釈するいくつかの方法がありますf(**kwargs)...
ディア・ハンター

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.