もしじるし

エンジニアとしての学び。人生の気付き。憧れの人へ出会うまでの道のり。

Python3 キーワード引数として扱いたいが必須項目にしたい

シチュエーション

関数定義においてキーワード引数として扱いたいが必須項目にしたいとき。

結論

befor

def hoge(name, greetings=None, ending=None):
    if greetings is ending is None:
        print('引数が足りません')
        return
    print(f'{greetings}。私の名前は{name}{ending}。')

hoge('みなみ')
# >> 引数が足りません

hoge('みなみ', greetings='こんにちはー', ending='でーす')
# >> こんにちはー。私の名前はみなみでーす。

after

def hoge(name, *, greetings, ending):
    print(f'{greetings}。私の名前は{name}{ending}。')

# hoge('みなみ')
# >> TypeError: hoge() missing 2 required keyword-only arguments: 'greetings' and 'ending'

hoge('みなみ', greetings='こんにちはー', ending='でーす')
# >> こんにちはー。私の名前はみなみでーす。

ちょっと解説

Python3 から *の後に続く引数はデフォルト値の無いキーワード引数となります。
デフォルト値を持たせることもできますし、今回の例のように省略することも可能です。
引数が不足している場合はTypeErrorを出力します。
引数を指定していた時はエラーが出ていなかったのにエラー発生させていいの?と躊躇いが出るかもしれません。
例えば、ユーザーに入力を任せるシステムだったらbeforの方が親切そうに見えますがそんなことありません。
ユーザーに入力してもらった時点で引数をチェックすればよいだけです。
この関数の責任は、渡された値を組み合わせてメッセージを表示することであってパラメータのチェックを行うことは責任外です。

話がそれましたが、「キーワード引数として扱いたいが必須項目にしたい!」シチュエーションに出会った際には積極的に使用していこうと思います。