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.mail
は None
になります。
予期しないデータが作成されているのにエラーにならないので、プログラムの別の場所でエラーになったり、必要なデータが保存されない問題があります。
ベストプラクティス¶
不用意に *args
、 **kwargs
を使わずに個別の引数で指定しましょう。
class User:
def __init__(self, name, mail=None):
self.name = name
self.mail = mail
この場合、存在しない引数を指定すればエラーになります。
(中略)詳細は書籍 自走プログラマー をご参照ください