2017-01-17 1 views
2

クラスが__getattr__メソッドを定義する場合、要求された属性が見つからない場合は、AttributeErrorを発生させる必要があります。__getattr__でのAttributeErrorのフォーマット

ただし、単にraise AttributeError()を実行すると、通常のエラーメッセージが表示されません。

現在、私が代わりに次のことをやっている:

raise AttributeError("'{}' object has no attribute '{}'".format(self.__class__.__name__, name)) 

しかし、これはボイラープレートコードの多くで、Pythonインタプリタは、たとえばた場合は一貫性のないエラーメッセージの可能性を秘めていますローカライズされた

__getattr__メソッドが定義されていないときと同じ方法で、エラーメッセージを組み立てるための方法はありますか?

答えて

2

デフォルトのエラー(書式付きメッセージとともに)は通常object.__getattribute__になります。そのため、Pythonにエラーフォーマットを行わせたい場合には、このメソッドを呼び出してください。

かわいいことをすることができますし、__getattr__スーパークラスに電話してみてください。 __getattr__が存在しない場合は、あなたが戻ってエラーをフォーマットするの世話をする__getattribute__を使用することに落ちることができます:もちろん

class Foo(object): 
    def __getattr__(self, attr): 
     try: 
      return super(Foo, self).__getattr__(attr) 
     except AttributeError: 
      return super(Foo, self).__getattribute__(attr) 


f = Foo() 
x = f.bar 

を、これはスーパークラスの中で上げてしまうかもしれませんすべての(おそらく有用)エラーをツバメ__getattr__ので、あなたは、現在のクラスが適切にフォーマットAttributeErrorを上げるべきであることを知っあなたのコード内の地点であれば、あなたはもう少し直接的な何かを行うことができます...慎重

これを使用します。

標準ライブラリの
+0

'object'には' __getattr__'がありません。 – user2357112

+0

@ user2357112 - いつものように、あなたは完全に正しいです。私は別の解決策で更新しました。 – mgilson

+1

属性値を '返す 'ことを忘れないでください。 – user2357112

2

ほとんどそのような場合は、メッセージを気にしてばかりの引数として名前を使用しないでください。

raise AttributeError(attr) 

トレースバックが残りを伝えるせます。