リストやタプルの中身を展開して関数に引数として渡す
いくつかの関数は,可変長位置引数としてリストやタプルを渡すことができるが,できないものもある.
参考:変数の種類について
note.crohaco.net
たとえば,osモジュールのos.path.join()などがそれである.
os.path.join()は,直接複数の文字列を渡すとパス区切りで繋いでくれるが,リストを渡すとリストがそのまま返ってくる.
import os os.path.join('hoge', 'huga', 'piyo') # -> 'hoge/huga/piyo' lst = ['hoge', 'huga', 'piyo'] os.path.join(lst) # -> ['hoge', 'huga', 'piyo']
じゃあリストの形で保持している引数は渡せないのかというと,さっと検索すればこんなのがある.
torina.top
os.path.join(*lst)
# -> 'hoge/huga/piyo'
リストにアステリスクをつけると展開される.
同様のことはapply()というのでもできるらしい.
python-reference.readthedocs.io
ところが,アステリスクによって展開したリストはほかの文字列の引数と共存できない(少なくとのこの場合は).
os.path.join(*lst, 'paru') # -> File "<stdin>", line 1 # -> SyntaxError: only named arguments may follow *expression
まあ,この仕様のことがわかっていれば,追加したい文字列をリストにあらかじめ追加しておけばいいのだが.
ちなみにpython2を前提に考えているが,3系統だと違った挙動をするのかも.
また,join()系統はリストに空要素がある場合には無視するらしい.
つまり絶対パスを.split()なんかで分割してしまった場合,冒頭の'/'の前の部分を指していた空要素は消えてしまう.
lst2 = '/hoge/huga/piyo'.split(os.sep) # -> lst2 = ['', 'hoge', 'huga', 'piyo'] os.path.join(*lst2) # -> 'hoge/huga/piyo'