の Python 2 実装hasattr
はかなり素朴で、その属性にアクセスして、例外が発生するかどうかを確認するだけです。
残念ながら、アクセスしようとした属性の名前に一致するhasattr
だけでなく、あらゆる例外タイプを食べます。AttributeError
示されている例でa をキャッチしたNameError
ため、誤った結果False
が返されます。さらに厄介なことに、プロパティ内の未処理の例外が飲み込まれ、プロパティ コード内のエラーが失われ、バグが隠されます。
Python 3.2+ では、動作が修正されました。
hasattr(object, name)
引数はオブジェクトと文字列です。結果はTrue
、文字列がオブジェクトの属性の 1 つの名前である場合、False
そうでない場合です。(これは、呼び出しgetattr(object, name)
て an が発生するかどうかを確認することで実装されAttributeError
ます。)
修正はこちらにありますが、その変更はバックポートされませんでした。
Python 2 の動作が問題を引き起こす場合は、使用を避けることを検討してくださいhasattr
。代わりに、 try/except around を使用して、例外タイプのみgetattr
をキャッチし、他の例外を未処理のままにすることができます。AttributeError