9:関数の引数に可変長引数を乱用しない

Pythonの便利な機能である 可変長引数 の *args**kwargs ですが、無思慮に使いすぎるとバグを仕込みやすいプログラムになります。

どういった問題があるのでしょうか? プログラムを見ながら考えてみましょう。

具体的な失敗

class User:
    def __init__(self, **kwargs):
        self.name = kwargs['name']
        self.mail = kwargs.get('mail')

この User は以下のように、クラスが期待していない email= 引数を受け取れてしまいます。 email= と勘違いしてプログラムした場合に、エラーになりません。

>>> user = User(name="hiroki", email="hiroki@example.com")

ここで user.mailNone になります。 予期しないデータが作成されているのにエラーにならないので、プログラムの別の場所でエラーになったり、必要なデータが保存されない問題があります。

ベストプラクティス

不用意に *args**kwargs を使わずに個別の引数で指定しましょう。

class User:
    def __init__(self, name, mail=None):
        self.name = name
        self.mail = mail

この場合、存在しない引数を指定すればエラーになります。

cover

(中略)詳細は書籍 自走プログラマー をご参照ください