2008年9月13日土曜日

Python の可変引数

1. 引数の前につけるアスタリスク

Python で可変引数を利用するには、引数の前にアスタリスクを書く。

最初に可変引数を見たのは、ITmedia エンタープライズ:2.4への機能強化で広がるPythonの世界 (3/4) の「リスト3 関数の引数の型をチェックするデコレータの例」。

def wrapper(*args, **kwargs):

関数の引数に前に、アスタリスクが1つの引数と2つの引数が書かれている。

 

リストと辞書

アスタリスク1つは、4.7.3. 任意引数リスト によると、

… 関数が任意の個数の引数で呼び出せるよう指定する方法があります。これらの引数はタプル (タプルとシーケンス を参照) に格納されます。可変個の引数の前に、ゼロ個かそれ以上の引数があっても構いません。…

アスタリスク2つは、4.7.4. 引数リストのアンパック によると、

同じやりかたで、 ** オペレータを使って辞書でもキーワード引数を渡すことができます。

4. その他の制御フローツール4.7.2 キーワード引数 によると、

仮引数の最後に **name の形式のものがあると、仮引数に対応しないすべてのキーワード引数が入った 辞書 を受け取ります。 **name*name の形式をとる、仮引数のリストを超えた固定引数の入ったタプルを受け取る引数 (次の節で述べます) と組み合わせることができます。 (*name**name より前になければなりません)。

 

2. 例

* がリスト、 ** が辞書へ対応している。
def test(*args):
    for e in args:
        print e

test(1,2,3,"hoge","piyo")


def test2(**keywords):
    for k,v in keywords.iteritems():
        print k, v

test2(a=100, b=200)


def test3(*args, **keywords):
    for e in args:
        print e
    for k,v in keywords.iteritems():
        print k,v

test3(1,2,3,"hoge","piyo",a=100,b=200):

 

引数の対応
「仮引数に対応しない」あふれた引数が辞書に入る。
def test4(arg1="", arg2="", **keywords):
    print "arg1, arg2: " + arg1, arg2
    print keywords
    
test4(arg1="hoge", a=100, b=200)
結果は、
arg1, arg2: hoge 
{'a': 100, 'b': 200}

キーワード引数に対応していない引数の部分が **keywords に流れこんだのがわかる。

追記(2008.9.28) : Python でリスト内のリストを連結 に使い方の例がある。