今回は、Pythonにある「可変長引数」をご紹介したいと思います!!
可変長引数って?
関数やメソッドを作る時に引数を定義する場合があると思います。でも、これって固定じゃないですか??これを臨機応変にできるのが「可変長引数」です!
可変長引数は、2種類の3パターンあるので1つ1つ見ていきたいと思います(`・ω・´)ゞ
*args
引数名の前に「*」を付与することで、1種類目の可変長引数となります。
def sum(*args): pass
すると、以下の様に指定された引数がすべて「args」にまとめられます!この時「args」は「tuple型」になります(`・ω・´)ゞ
sum(2, 4, 8, 16, 32, 128)
受け取った値を処理してみます!
def sum(*args): result = 0 for arg in args: result += arg return result print sum(2, 4, 8, 16, 32, 128)
ちょうど「os.path.join」みたいな関数を作ることができます!(*´ω`*)b
「*」をつけた引数は、一番最後に指定する必要があります。例えば、1つ目の引数を「offset」する場合は、以下のようになります。
def sum(offset, *args): result = offset for arg in args: result += arg return result print sum(256, 2, 4, 8, 16, 32, 128) # 446
**kargs
引数名の前に「**」を付与することで、2種類目の可変長引数となります。
def calc(**kwargs): print kwargs calc(data=128, mode=1, offset=0) # {'data': 128, 'mode': 1, 'offset': 0}
すると、指定された引数がすべて「kwargs」にまとめられます!この時「kwargs」は「dict型」になります(`・ω・´)ゞ
こちらも、固定の引数の後に書く必要があります。
def calc(data, **kwargs): print data, kwargs calc(128, mode=1, offset=0) # 128 {'mode': 1, 'offset': 0}
*argsと**kwargsのあわせ技
「*args」と「**kwargs」は、同時に使用することができます!引数の定義の順番は、「固定の引数」「*args」「**kwargs」とする必要があります。
def calc(data, *args, **kwargs): print data print args print kwargs calc(128, 2, 4, 8, 128, mode=1, offset=0) # 128 # (2, 4, 8, 128) # {'mode': 1, 'offset': 0}
*argsと**kwargsのあわせ技は、よくPySideのクラスを継承した時に使っています!例えば「QPushButton」を継承した時、必要になる「__init__」は3種類あります。
- QPushButton(QWidget parent)
- QPushButton(QString text, QWidget parent)
- QPushButton(QIcon icon, QString text, QWidget parent)
固定の引数で定義してしまうと、3種類ある作り方を潰してしまう、制限してしまうことになります(´・ω・`)
そこで!
*argsと**kwargsのあわせ技を使って定義すると、QPushButtonの「__init__」をあまり気にしないで良くなります!
from PySide import QtGui class Button(QtGui.QPushButton): def __init__(self, *args, **kwargs): super(Button, self).__init__(*args, **kwargs)
受け取った引数をすべて、基底クラスのQPushButtonに丸投げすることができます(゚∀゚)
ボタンなどのコールバックで、引数を使う必要がないのに数がまちまち、、、っという時にも役立つと思います!(`・ω・´)ゞ
夏終わっちゃったんですね、、、ハヤすぎでしょ!!ヽ(`Д´)ノウワァン