位置限定引数(Positional-only Arguments)
Pythonをさらに深く学んでいくと、関数の引数に関するさまざまな概念に出会います。Pythonでは、関数に引数を渡す方法はいくつかあり、デフォルト引数、キーワード引数、位置引数などがあります。その中でも、キーワードではなく位置でのみ指定できる特別な引数があります。これを「位置限定引数」と呼びます。
Python 3.8以降では、関数定義の中で特定の引数を位置限定引数とするために、特殊な記法として
/
を使用します。関数定義で /
の前にある引数が位置限定引数となります。3つの数を足す次の関数を考えてみましょう:
def add_numbers(a, b, c):
return a + b + c
この関数は、定義された順番、つまり位置によって引数を渡すことができます:
print(add_numbers(10, 20, 30))
# outputs: 60
また、引数の名前を使ってキーワード引数として呼び出すこともできます:
print(add_numbers(a=10, b=20, c=30))
# outputs: 60
しかし、特定の引数が常に特定の順序で提供されるようにしたい場合はどうでしょうか。そのような場合に位置限定引数が役立ちます。
add_numbers
関数を修正して、a
と b
を位置限定引数にしてみましょう:def add_numbers(a, b, /, c):
return a + b + c
この関数は引き続き位置によって引数を渡すことができます:
print(add_numbers(10, 20, 30)) # 60
print(add_numbers(a=10, b=20, c=30)) # TypeError
print(add_numbers(10, 20, c=30)) # 60
しかし、位置限定引数をキーワード引数として渡そうとすると、
TypeError
が発生します。この場合、a
と b
は位置によって指定する必要があります。引数 c
は位置でもキーワードでも指定できます。位置限定引数の記法は次のとおりです:
- 位置限定引数は関数定義内の
/
より前に記述します。
- 関数定義に
/
がある場合、その前の引数は位置限定となります。
- 位置限定引数はキーワード引数として渡すことはできません。
/
の後の引数は位置またはキーワードのどちらでも渡せます。
Pythonの組み込み関数で位置限定引数を持つものはありますか?
はい、多くのPythonの組み込み関数は位置限定引数を持っています。例えば、
abs()
関数がその一例です。help(abs)
# Help on built-in function abs in module builtins:
# abs(x, /)
# Return the absolute value of the argument.
abs(-6) # 6
abs(x=-6) # TypeError: abs() takes no keyword arguments
abs
のパラメータ x
は位置限定引数であり、これをキーワード引数として渡そうとすると、プログラムは TypeError
を投げます。