Python のキーワード専用引数と位置専用引数(/ と *)

Python 3.8 から、位置専用引数(/)とキーワード専用引数(*)を使って、引数の渡し方を制限できるようになりました。

キーワード専用引数(*)

  • の後に定義された引数は、キーワードでしか渡せません。
def greet(name, *, greeting="Hello"):
    print(f"{greeting}, {name}!")

greet("Alice")                    # OK
greet("Alice", greeting="Hi")     # OK
greet("Alice", "Hi")              # エラー

呼び出し側が引数名を明示するため、コードの可読性が上がります。

位置専用引数(/)

/ の前に定義された引数は、位置でしか渡せません。

def power(base, exp, /):
    return base ** exp

power(2, 3)           # OK: 8
power(base=2, exp=3)  # エラー

内部実装の引数名を変更しても呼び出し側に影響しないため、ライブラリ設計で有用です。

組み合わせて使う

/ と * を組み合わせると、3 種類の引数を定義できます。

def func(pos_only, /, standard, *, kw_only):
    print(pos_only, standard, kw_only)

func(1, 2, kw_only=3)           # OK
func(1, standard=2, kw_only=3)  # OK
func(pos_only=1, standard=2, kw_only=3)  # エラー
位置引数の種類渡し方
/ の前位置専用位置のみ
/ と * の間通常どちらでも可
* の後キーワード専用キーワードのみ

API 設計の際に、引数の渡し方を明確にすることでミスを防げます。