きり丸の技術日記

技術検証したり、資格等をここに残していきます。

Pythonで可変長引数のメソッドに配列を渡したい(位置引数、positional argument)

Pythonで可変長引数のメソッドしか用意されていないものの、処理上は配列にしてパラメータを渡すしかないことがあります。

今回の記事では、配列を可変長引数に渡せるようにする方法を残します。

環境

  • Python
    • 3.9

方法

配列の変数に対して*を付与すると、可変長引数のメソッドにパラメータを渡せます。なお、これを位置引数(positional argument)と呼びます。

print([x for x in range(10)])
# [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]
print(*[x for x in range(10)])
# 0 1 2 3 4 5 6 7 8 9

類似としてはキーワード引数(keyword argument)があり、Python使用している人であれば、キーワード引数を積極的に使用していると思われます。

ユースケース

  • for文では解決できず、可変長引数で渡すしかない

別の方法があるかもしれませんが、sqlalchemyで複合条件を使用したい時に使用しました。

# SQLでいうと、AとBの複合条件で検索したい
# (A, B) IN ((?, ?), (?,?)...)
# AND((A.A AND B.B) OR (A.A AND B.B)...)
.where(and_(
    or_(
        *[and_(
            DB.A == data.A, 
            DB.B == data.B
        )
        for data in datum]
    )
))

ソースコード

なし。

終わりに

基本的にはFor文で対応できることが多いので、方法を知るまで地味に苦労しました。配列に詰めるまではいいものの、そこから位置引数として渡す方法が分からず…。検索キーワードも思いつきませんでしたしね。

積極的には使用しないと思いますが、他の人の参考になれば幸いです。

参考情報