サーチ…


備考

注意すべき点がいくつかあります:

  1. argskwargsという名前は規約で使用されていますが、言語仕様の一部ではありません。したがって、これらは同等です:

     def func(*args, **kwargs):
         print(args)
         print(kwargs)
    

     def func(*a, **b):
         print(a)
         print(b)
    
  2. 複数のargsまたは複数のkwargsパラメータを持つことはできません(ただし必須ではありません)

     def func(*args1, *args2):
     #   File "<stdin>", line 1
     #     def test(*args1, *args2):
     #                      ^
     # SyntaxError: invalid syntax
    

     def test(**kwargs1, **kwargs2):
     #   File "<stdin>", line 1
     #     def test(**kwargs1, **kwargs2):
     #                       ^
     # SyntaxError: invalid syntax
    
  3. *argsに続く任意の位置引数は、名前だけで渡すことができるキーワードのみの引数です。 *args代わりに単一の星を使用して、可変引数リストを提供せずに値をキーワード引数にすることができます。キーワードのみのパラメータリストは、Python 3でのみ使用できます。

     def func(a, b, *args, x, y):
         print(a, b, args, x, y)
    
     func(1, 2, 3, 4, x=5, y=6)
     #>>> 1, 2, (3, 4), 5, 6
    

     def func(a, b, *, x, y):
         print(a, b, x, y)
    
     func(1, 2, x=5, y=6)
     #>>> 1, 2, 5, 6
    
  4. **kwargsはパラメータリストの最後に来なければなりません。

     def test(**kwargs, *args):
     #   File "<stdin>", line 1
     #     def test(**kwargs, *args):
     #                      ^
     # SyntaxError: invalid syntax
    

関数を書くときに* argsを使う

タプル内のすべての位置(つまり名前のない)引数を収集する関数を書くときに*を使うことができます:

def print_args(farg, *args):
   print("formal arg: %s" % farg)
   for arg in args:
       print("another positional arg: %s" % arg)

呼び出しメソッド:

print_args(1, "two", 3)

その呼び出しでは、fargはいつものように割り当てられ、他の2つは受け取った順にargsタプルに渡されます。

関数を書くときに** kwargsを使う

パラメータ名の前にダブルスター**を使用して、任意の数のキーワード(名前付き)引数を取る関数を定義することができます。

def print_kwargs(**kwargs):
    print(kwargs)

メソッドを呼び出すと、Pythonはすべてのキーワード引数の辞書を作成し、それを関数本体で利用できるようにします:

print_kwargs(a="two", b=3)
# prints: "{a: "two", b=3}"

関数定義の** kwargsパラメータは常に最後のパラメータでなければならず、前のパラメータの後に渡された引数にのみ一致することに注意してください。

def example(a, **kw):
    print kw

example(a=2, b=3, c=4) # => {'b': 3, 'c': 4}

関数本体の中で、 kwargsは辞書と同じ方法で操作されます。 kwargs個々の要素にアクセスするには、通常の辞書と同じようにループします。

def print_kwargs(**kwargs):
    for key in kwargs:
        print("key = {0}, value = {1}".format(key, kwargs[key])) 

print_kwargs(a="two", b=1)を呼び出すと、次の出力が表示されます。

print_kwargs(a = "two", b = 1)
key = a, value = "two"
key = b, value = 1

関数を呼び出すときに* argsを使う

関数定義の*args一般的な使用例は、処理をラップ関数または継承した関数のいずれかに委譲することです。典型的な例はクラスの__init__メソッドにあるかもしれません

class A(object):
    def __init__(self, b, c):
        self.y = b
        self.z = c

class B(A):
    def __init__(self, a, *args, **kwargs):
        super(B, self).__init__(*args, **kwargs)
        self.x = a

ここで、 aパラメータは、他のすべての引数(位置およびキーワード)が基底クラスに渡され、処理された後に、子クラスによって処理されます。

例えば:

b = B(1, 2, 3)
b.x  # 1
b.y  # 2
b.z  # 3

ここで起こるのは、クラスB __init__関数が引数1, 2, 3見ることです。 1つの位置引数( a )を取る必要があることを知っているので、( 1 )で渡された最初の引数を取得するので、関数a == 1スコープ内で渡します。

次に、任意の数の位置引数( *args )を取る必要があるので、( 1, 2 )で渡された残りの位置引数を取り、 *argsます。今(関数の範囲内で) args == [2, 3]

次に、 *args使ってクラスA__init__関数を呼び出します。 Pythonはargsの前に*を見て、リストを引数に "展開"します。クラス場合、この例では、 B__init__関数はクラス呼び出しA S ' __init__関数は、引数が渡されます2, 3 (すなわち、 A(2, 3)

最後に、独自のxプロパティを1に等しい最初の位置引数aに設定します。

関数を呼び出すときに** kwargsを使う

ディクショナリを使用して、関数のパラメータに値を割り当てることができます。辞書内のキーとしてパラメータnameを使用し、各キーにバインドされたこれらの引数の値を使用します。

def test_func(arg1, arg2, arg3): # Usual function with three arguments
   print("arg1: %s" % arg1)
   print("arg2: %s" % arg2)
   print("arg3: %s" % arg3)

# Note that dictionaries are unordered, so we can switch arg2 and arg3. Only the names matter.
kwargs = {"arg3": 3, "arg2": "two"}

# Bind the first argument (ie. arg1) to 1, and use the kwargs dictionary to bind the others
test_var_args_call(1, **kwargs) 

関数を呼び出すときに* argsを使う

関数を呼び出すときに引数に*演算子を使用すると、リストまたはタプル引数をアンパックする効果があります

def print_args(arg1, arg2):
    print(str(arg1) + str(arg2))

a = [1,2]
b = tuple([3,4])

print_args(*a)
# 12
print_args(*b)
# 34

スター付き引数の長さは、関数の引数の数と同じである必要があることに注意してください。

一般的なPythonのイディオムは、 zip関数でアンパック演算子*を使用してその効果を逆転させることです:

a = [1,3,5,7,9]
b = [2,4,6,8,10]

zipped = zip(a,b)
# [(1,2), (3,4), (5,6), (7,8), (9,10)]

zip(*zipped)
# (1,3,5,7,9), (2,4,6,8,10)

キーワードのみとキーワードが必要な引数

Python 3では、デフォルト値を指定しなくてもキーワードでしか代入できない関数引数を定義することができます。これはstar *を使用して、キーワードパラメータを設定せずに追加の位置パラメータを消費することによって行われます。 *の後のすべての引数は、キーワードのみの(つまり、非定位置の)引数です。キーワードのみの引数にデフォルト値が与えられていない場合は、関数を呼び出すときに引き続き必要であることに注意してください。

def print_args(arg1, *args, keyword_required, keyword_only=True):
    print("first positional arg: {}".format(arg1))
    for arg in args:
        print("another positional arg: {}".format(arg))
    print("keyword_required value: {}".format(keyword_required))
    print("keyword_only value: {}".format(keyword_only))
    
print(1, 2, 3, 4) # TypeError: print_args() missing 1 required keyword-only argument: 'keyword_required'
print(1, 2, 3, keyword_required=4) 
# first positional arg: 1
# another positional arg: 2
# another positional arg: 3
# keyword_required value: 4
# keyword_only value: True

kwarg値を辞書に入れる

def foobar(foo=None, bar=None):
    return "{}{}".format(foo, bar)

values = {"foo": "foo", "bar": "bar"}

foobar(**values) # "foobar"

** kwargsとデフォルト値

** kwargsでデフォルト値を使用するには

def fun(**kwargs):
    print kwargs.get('value', 0)

fun()
# print 0
fun(value=1)
# print 1


Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow