技術

Pythonの関数を呼ぶときに「引数名=」を付加するべきか?

Pythonで関数を呼び出すときに、引数名を省略するのかしないのか、いつもこの書き方で迷っています。

そして、いまだに答えがわかりませんし、自分の中での方針も定まっていなかったりします。

※この記事は解決作を提示するものでは、ありません。ただ迷っていますということを書いただけのものになります。

何を迷っているの?

Pythonには関数を呼ぶときに、引数名を記述する書き方があります。例としては以下の様な感じです。

def sample(name: str) -> None:
    print(f"hello {name}")


sample(name="foo")

これはもちろん

sample("foo")

と書くこともできます。

で、どちらの方法で書くか、時々迷うわけです。

Google Python Style Guideにも記載がなさそうですし、flake8などで設定もなさそうですし、そんなにこだわることではないのでしょうか? ごちゃ混ぜでいいのでしょうか?

自分の中でも方針が決まっていませんし、私が一人で書いている場合でもごちゃ混ぜになることが多々あります。

「引数名=値」って名称不明

そもそも、

sample(name="foo")

という書き方の名称が不明です。引数的には位置引数ですが、使い方キーワード引数で、どっちやねんという感じです。他のプログラミング言語には、こういった書き方はないので、一般的な名称もなさそうです。

ここでは便宜上、イコール記法ということにします。

で、どちらの方法で書くべきか?

イコール書かない派

個人的な雑感ですが、イコール記法は使わないほうが主流な気がします。

他人が書いたコードを読む時は、イコール記法で書かれていないことがほとんどの気がします。キーワード引数など必要な時にのみ、明示していてそれ以外は、値だけ放り込んである書き方がほとんどのようです。

まあ、わからなくもありません。

そもそも他の言語だと、こういった書き方はありませんし、位置引数の引数名や順番はIDEですぐ確認できますし(JetbrainsだとQuick Definitionと呼ばれている機能)、書かない方がコードが短くてスッキリしますしね。

イコール書く派

少数派だとは思いますが、私は1人でコードを書くとき、もしくはスクラッチで最初のベースを私が書いていく場合は、イコール記法で書くことが多いです。

理由は

  • バグが少なくなりやすい気がする
  • 読みやすいときがある

などが理由です。

引数名があらかじめ見えていれば、位置引数の順番間違いや間違った値を入れる可能性が下がります。また、コードが長くなって煩雑にはなりますが、場合によっては見やすく(コードが何やっているか把握しやすく)なります。

明らかに書く必要がない場合(以下の様に、引数名と変数名が同じ場合など)は書かなかったりすることもあります。

def sample(name: str) -> None:
    print(f"hello {name}")


name="foo"
sample(name=name)

また、速度優先でばーっと書き上げる場合は、書かないこともあったりして、結局イコール記法とそうでない記法がごちゃ混ぜになってしまいます。

それでもやっぱり、書いてあった方がいいと思うことが多いので、コード全体の統一性は下がりますが、気づいたとき、便利だと思うときは書くようにしています。

まとめ

以上、Pythonの記法で、関数を呼ぶときに、引数名を入れるかどうかについての考察でした。

こういったことであまり迷いたくないので、flake8などのリンターでどうにかしてほしいものです。