Open2

キーワード専用引数と位置専用引数

k.hirookak.hirooka

キーワード引数

定義

def func(a=None, b=None):
    ...

呼び出し

func(1, 1)   # 位置引数でもいけちゃう
func(a=1, b=1)

キーワード引数で渡しても、位置引数で渡してもOK

キーワード専用引数

定義

def func(a=None, *, b=None, c=None):
    ...

*の後の引数がキーワード専用引数として定義される

呼び出し

def func(1, a=1, b=1) 

位置専用引数

定義

def func(a, b, /, *, c):
    ...

/の前の引数が位置専用引数として定義される

呼び出し

def func(1, 1, c=1)

これ以外の渡し方をするとエラーが出る

利用の方針

  1. 関数定義後に引数の変数名の変更があることが想定されない場合はキーワード専用引数が良さそう
  2. 逆に位置専用のいいところは?、冗長な書き方を避けることができることかな
    ただ、それについてもバグの修正で見かける位置引数のずれとかをみると、冗長でもキーワード引数がいいのではと思ってしまう。
  3. もう一つの考え方があるとすれば、明示的にキーワード引数を使うことで、その引数に意味を持たせることができること。逆にそれ以外は位置引数とすることで、コードの意味がはっきりし読みやすくなる。

感じたこと

どうやってこういう言語仕様を実装しているのだろう。
時間がある時にCPythonのコードを読んでみることにする。
https://github.com/python/cpython

k.hirookak.hirooka

標準ライブラリのsorted()関数

sorted(iterable, /, *, key=None, reverse=False)

関数として、処理する主となる一つの引数を位置専用引数で受けて、それ以外のオプショナルな引数をキーワード専用引数で受けるのはとてもわかりやすくて、いい設計のように思える。