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 設計の際に、引数の渡し方を明確にすることでミスを防げます。