ちゃぱブログ / エンジニアリング / マネジメント

とあるプロダクトの運用組織のマネジメントしてる人の雑記。主にエンジニアリングやマネジメントのことを書きます。ときおりプチ情報も

(Python)キーワード専用引数と位置引数について

まとめ

関数を定義するときに、キーワード専用引数として指定することができる(Python3.8以降だと、位置専用引数も指定できる)。 要は、「*」より後は必ずキーワード専用引数となり、「/」より前は必ず位置専用引数となる。 極端な例で書くと、

全てをキーワード専用変数として指定する

def hoge(*, a, b):
    return(a, b)

このとき、関数の引数がキーワード専用となるので、「a="hogehoge", b="hogehoge"」のように関数を利用しないとエラーとなる。つまり、

# これはNG
# TypeError: hoge() takes 0 positional arguments but 2 were given
hoge("a1", "b1")

# これはOK
hoge(a="a1", b="b1")

全てを位置専用変数として指定する(Python3.8以降)

def hoge(a, b, /):
    return(a, b)

このとき、a、bともに位置専用引数として指定されているので、

# これはNG
# TypeError: hoge() got some positional-only arguments passed as keyword arguments: 'a, b'
hoge(a="a", b="b")

# これはOK
hoge("a1", "b1")

どのようなときに使うのだろうか?

個人的には「キーワード専用」に指定することは、コードの可読性が高まりそうだなと思う。位置専用にする意図はあまり理解できない。どちらも受け入れればいいのでは?という気がする。強いて言えば、位置専用にしていれば、引数の名前を変更しても利用側に影響がないように強制できる、ということはある(が、実際の現場だと、そうはいってもテストしてしまいそう)。