python の 可変長引数, variable length argument は引数が省略され得る。
def func1(*items):
return items
assert func1() == tuple()
引数が省略されると困る場合は、引数が省略された場合に TypeError()
を送出するなどの実装を検討する。
def func2(*items):
if len(items) > 0:
return items
else:
raise TypeError("At least one argument required.")
func2()
-> TypeError
確かにfunc2
は安全になったが、Runtime error が送出されるまで引数が省略されたことが分からない。そこで、以下のように実装すると、1つ以上の引数を強制できる。(Syntax error)
def func3(item, *items):
return (item, ) + items
なお、itertools.chain
を使うと効率的にできる。
from itertools import chain
def func4(item, *items):
return tuple(chain((item, ), items))
いずれの実装でも1つ以上の引数をとる場合には同じ出力になる。もし、引数の省略を許さないなら、func1
よりも func3
や func4
がやさしい。