Pythonの可変長引数を使いこなす!!

takkun
どうも!たっくんです。
夏終わっちゃったんですね、、、ハヤすぎでしょ!!ヽ(`Д´)ノウワァン

今回は、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種類あります。

  1. QPushButton(QWidget parent)
  2. QPushButton(QString text, QWidget parent)
  3. 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に丸投げすることができます(゚∀゚)

ボタンなどのコールバックで、引数を使う必要がないのに数がまちまち、、、っという時にも役立つと思います!(`・ω・´)ゞ