「最小限の驚き」と可変デフォルト引数

PYTHON3 チュートリアル

はじめに

Pythonで関数を設計する際、デフォルト引数を使うことは非常に一般的です。しかし、デフォルト引数が可変オブジェクト(例えばリストや辞書など)の場合、予期しないバグや混乱を引き起こす可能性があります。これは「最小限の驚き」の原則に反します。この原則は、プログラムがユーザーの期待に沿った振る舞いをするべきだというものです。

問題の背景

Python関数で可変デフォルト引数を使用すると、その引数は関数が定義された時点で作成され、以後同じオブジェクトが使われ続けます。これが原因で、関数が呼び出されるたびにデフォルト引数の値が変更される可能性があります。

def append_to(element, to=[]):
    to.append(element)
    return to

print(append_to(12))  # [12]
print(append_to(17))  # [12, 17]

上記の例では、意図せずにリストが累積されてしまいます。これは多くの場合、開発者の意図しない振る舞いです。

解決策

この問題を解決するためには、デフォルト引数としてNoneを使用し、関数内でこれをチェックして適切なデフォルト値を設定する方法があります。

改善されたアプローチ

def append_to(element, to=None):
    if to is None:
        to = []
    to.append(element)
    return to

print(append_to(12))  # [12]
print(append_to(17))  # [17]

この方法では、各関数呼び出しで新しいリストが作成され、予期しない副作用が発生することがなくなります。

まとめ

Pythonで可変デフォルト引数を安全に使用するには、Noneをデフォルト値として設定し、関数内でこの値をチェックすることが重要です。これにより、「最小限の驚き」の原則に従い、コードの読みやすさと予測可能性が向上します。このテクニックは、Pythonコミュニティにおいて広く推奨されており、バグを防ぎながら効率的なコーディングを促進します。

購読
通知
0 Comments
Inline Feedbacks
View all comments