在__getattr__中格式化AttributeError

时间:2017-01-17 17:41:57

标签: python

如果某个类定义了__getattr__方法,则在找不到所请求的属性时需要引发AttributeError

但是,如果只执行raise AttributeError(),则会丢失通常的错误消息。

目前,我正在执行以下操作:

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

然而,这是很多锅炉板代码,并且如果python解释器是例如,则可能存在不一致的错误消息。本地化。

有没有办法让python处理组装错误消息的方式与定义__getattr__方法时的方式相同?

2 个答案:

答案 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.