Pythonの可変長引数

デフォルト値の設定された引数とかでなんとかなるので可変長引数はあまり書く機会がなかったんだけれど、動的にメソッドを呼ぶメソッドを作ったりしていると、可変長引数が必要になったので調べた時のメモ。

可変長引数な関数を定義する

  • *argsと**kwargでメソッドへの引数がタプルで受け取れる。
  • *と**は演算子なのかな?と思ったんだけど構文らしい。
    • メソッドの第一引数として使われるselfもargsで受け取ることができる。
    • foo(self, var_a, *args)のようにすることで引数一つは確実に受け取り残りを可変長とすることができる。
    • 引数が存在しない場合は空のタプルが*argsに入ってくる。
class Klass(object):
    def dump1(*args,**kwarg):
        print args
        print kwarg

    def dump2(self, *args,**kwarg):
        print self
        print args
        print kwarg

    @classmethod
    def dump3(*args,**kwarg):
        print args

    def dump4(self, *args, **kwarg):
        self.dump1(*args, **kwarg)

klass = Klass()

print "klass.dump1('aaa', 'bbb') ------------------------------------"
klass.dump1('aaa', 'bbb')

print "klass.dump2('aaa', 'bbb') ------------------------------------"
klass.dump2('aaa','bbb')

print "Klass.dump3('aaa','bbb') ------------------------------------"
Klass.dump3('aaa','bbb')

print "klass.dump4('aaa','bbb') ------------------------------------"
klass.dump4('aaa','bbb')

出力はこういう感じ

klass.dump1('aaa', 'bbb') ------------------------------------
(<__main__.Klass object at 0x100455b10>, 'aaa', 'bbb')
{}
klass.dump2('aaa', 'bbb') ------------------------------------
<__main__.Klass object at 0x100455b10>
('aaa', 'bbb')
{}
Klass.dump3('aaa','bbb') ------------------------------------
(<class '__main__.Klass'>, 'aaa', 'bbb')
klass.dump4('aaa','bbb') ------------------------------------
(<__main__.Klass object at 0x100455b10>, 'aaa', 'bbb')
{}

関数呼び出すときに可変長引数を使う

method(*args, **kwargs)とすると引数を可変長にしたままで呼び出せる。

以下の例はtemp1が可変長の引数を受け取ってそのままtemp2を呼び出す。
デコレーターなんかで使っているのを見たこと有るんじゃないかと思う。

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

def temp1(*args, **kwargs):
     temp2(*args, **kwargs)