1. ホーム
  2. python

[解決済み] パラメータに**(ダブルスター/アスタリスク)、*(スター/アスタリスク)がありますが、これはどういう意味ですか?

2022-03-13 23:45:44

質問

以下のメソッド定義において *** する param2 ?

def foo(param1, *param2):
def bar(param1, **param2):

解決方法は?

その *args**kwargs の節で説明したように、関数に任意の数の引数を与えるための一般的なイディオムです。 関数の定義について Pythonのドキュメントにあります。

*args を実行すると、すべての関数パラメータが得られます。 タプルとして :

def foo(*args):
    for a in args:
        print(a)        

foo(1)
# 1

foo(1,2,3)
# 1
# 2
# 3

**kwargs をすべてお渡しします。 キーワード引数 ただし、辞書としての正式なパラメータに対応するものを除く。

def bar(**kwargs):
    for a in kwargs:
        print(a, kwargs[a])  

bar(name='one', age=27)
# name one
# age 27

どちらのイディオムも、通常の引数と混ぜることで、固定引数と一部の可変引数のセットを可能にします。

def foo(kind, *args, **kwargs):
   pass

また、これを逆に利用することも可能です。

def foo(a, b, c):
    print(a, b, c)

obj = {'b':10, 'c':'lee'}

foo(100,**obj)
# 100 10 lee

もう一つの使い方は *l イディオムは 引数リストを展開する 関数を呼び出すときに

def foo(bar, lee):
    print(bar, lee)

l = [1,2]

foo(*l)
# 1 2

Python 3では、以下のように *l を代入の左側で使用します ( 拡張版イテラブル・アンパッキング ) のように、この文脈ではタプルの代わりにリストを与えますが。

first, *rest = [1,2,3,4]
first, *l, last = [1,2,3,4]

また、Python 3では、新しいセマンティックが追加されました( PEP 3102 ):

def func(arg1, arg2, arg3, *, kwarg1, kwarg2):
    pass

この関数は3つの位置引数しか受け付けません。 * はキーワード引数としてのみ渡すことができる。

注意

  • A Python dict キーワード引数の受け渡しに意味的に使用される、任意の順序で並べられます。しかし、Python 3.6では、キーワード引数は挿入順序を覚えていることが保証されています。
  • の要素の順番は **kwargs は、キーワード引数が関数に渡された順番に対応するようになりました." -。 Python 3.6での新機能
  • 実際、CPython 3.6 のすべての dicts は、実装の詳細として挿入順を記憶します。