概要
- シングルアスタリスク(*)とダブルアスタリスク(**)をあいまいに理解していたので、まとめてみました
- 変数名のargsやkwargsは任意でなんでもよいです
* (シングルアスタリスク) の使い方
- *args: タプルやリストをアンパック(展開)できる
def example_func(a, b, c):
return a + b + c
args = [1, 2, 3]
example_func(*args) # example_func(1, 2, 3)と同義
** (ダブルアスタリスク) の使い方
- **kwargs: 辞書をキーワード引数としてアンパック(展開)できる
def example_func(a, b, c):
return a + b + c
kwargs = {"a": 1, "b": 2, "c": 3}
example_func(**kwargs) # example_func(a=1, b=2, c=3)と同義
応用
- 辞書のアンパックをそのままquerysetに突っ込める
# 事前に必須のaにフィルターをかけるqueryを作成
filter_kwargs = {"a": self.a}
# cが0でない場合のみbにフィルターをかける条件を追加
if self.c != 0:
filter_kwargs["b"] = self.b
# 最後にfilterを実行(ここで初めてSQLが発行される)
self.d = XXX.objects.filter(
**filter_kwargs # ここで辞書がアンパックされる
).order_by("a")
上記は
self.c == 0 の場合:a のみでフィルタリング
self.c != 0 の場合:a + b でフィルタリング
される挙動になる