djangoの可変長引数についてまとめてみた


本日のお題

今回は、djangoの可変長引数についてまとめます。

可変長引数とはその名の通りで、引数の数に自由度があるもののことを言います。

通常の関数は第一引数が名前、第二引数が年齢などと何番目になんの引数が来るのかを明確にします(例1)。

このため、引数の位置が逆になったり数が合わなかったりするとエラーになりますよね。

例1
def info(name, age):
  print("私の名前はn" + name + "です。年齢は" + str(age) + "歳です。")

可変長引数に関しては数の指定がないので、いくつ引数を与えても処理をしてくれます。

目次

  • 可変長引数その1〜*args
  • 可変長引数その2〜**kwargs

可変長引数その1〜*args

可変長引数の一つ目は*argsです。

正確にいうと*が先頭についていればなんでも良いのですが、この引数を用いて定義された仮引数は可変長となります。

また、呼び出し時には、この部分に代入された引数全てがタプルの形で渡されます。

def print_all(*args):
  print(args)

print_all(1, 3, 4)
# (1, 3, 4)
# print((1, 3, 4))と同じ処理

もし*argsと位置引数を併用する場合には、「可変長引数を最後に渡す」もしくは「可変長引数の後に渡す引数をキーワード形式にする」必要があります。

# パターン1〜可変長引数を最後に配置
def my_families(name, *args):
  print(name + "さんの家族を紹介します")
  for arg in args:
    print(arg)

my_families("サザエ", "マスオ", "波平", "フネ", "カツオ", "ワカメ", "タラ")
# サザエさんの家族を紹介します。
# マスオ
# 波平
# ....以下省略......
# タラ

# パターン2〜可変長引数の後の引数はキーワード形式
def my_families(*args, name)
  print(name + "さんの家族を紹介します")
  for arg in args:
    print(arg)

my_families("マスオ", "波平", "フネ", "カツオ", "ワカメ", "タラ", name="サザエ")

可変長引数その2〜**kwargs

先程の*argsは不特定多数の引数をタプルの形で受け取りました。

**kwargs(正確にはアスタリスクが2つついた引数)ではキーワード形式の引数を辞書の形で受け取ります。

def my_families(name, **kwargs):
  print(name + "さんの家族を紹介します")
  for kwarg in kwargs:
    print(kwarg + ":" + kwargs[kwarg])

my_families("サザエ", ="マスオ", 父親="波平", 母親="フネ", ="カツオ", 異妹="ワカメ", 息子="タラ")
# サザエさんの家族を紹介します。
# 夫:マスオ
# 父親:波平
# ...省略...
# 息子:タラ

なお、キーワード引数を用いて**kwargsを先に持ってくることは可能です。

終わりに

以上がpythonの可変長引数の取扱い方でした。

この話題について調べようとしたのは、以下のコードがきっかけでした。

def PostForm(ModelForm):
  def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    self.fields["text"].required = False

modelFormクラスのrequiredオプションをfalseにしようと調べていたときに見つけたものです。

そちらも近々まとめます。