如果某个类定义了__getattr__
方法,则在找不到所请求的属性时需要引发AttributeError
。
但是,如果只执行raise AttributeError()
,则会丢失通常的错误消息。
目前,我正在执行以下操作:
raise AttributeError("'{}' object has no attribute '{}'".format(self.__class__.__name__, name))
然而,这是很多锅炉板代码,并且如果python解释器是例如,则可能存在不一致的错误消息。本地化。
有没有办法让python处理组装错误消息的方式与定义__getattr__
方法时的方式相同?
答案 0 :(得分:3)
标准库中的大多数此类情况都不会打扰消息,只需使用名称作为参数:
raise AttributeError(attr)
让追溯告诉剩下的人。
答案 1 :(得分: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
,那么您可以直接做一些事情:< / p>
class RaiseAlwaysExample(BaseClass):
def __getattr__(self, attr):
if True:
return object.__getattribute__(self, attr) # Raise appropriately formatted attribute error.