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
この場合、存在しない引数を指定すればエラーになります。
(中略)詳細は書籍 自走プログラマー をご参照ください
