Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何确定AttributeError引用的属性?_Python_Exception_Error Handling_Standard Library_Anti Patterns - Fatal编程技术网

Python 如何确定AttributeError引用的属性?

Python 如何确定AttributeError引用的属性?,python,exception,error-handling,standard-library,anti-patterns,Python,Exception,Error Handling,Standard Library,Anti Patterns,当我请求一个不存在的python对象的属性时,我会得到一个AttributeError,但是我在error对象的字段中没有找到所请求属性的名称。唯一提到请求属性名称的地方是错误的args成员 在我看来,解析错误消息以获取缺少的属性的名称有点麻烦。是否有任何方法可以在不解析错误消息的情况下获取缺少的属性的名称 演示: 目前还没有统一的方法来做到这一点。该功能已在中提出 目前还没有统一的方法。该功能已在中提出 它仍然是草稿不,没有。为什么不知道要访问的属性?即使您使用例如getattr动态执行此操作

当我请求一个不存在的python对象的属性时,我会得到一个AttributeError,但是我在error对象的字段中没有找到所请求属性的名称。唯一提到请求属性名称的地方是错误的
args
成员

在我看来,解析错误消息以获取缺少的属性的名称有点麻烦。是否有任何方法可以在不解析错误消息的情况下获取缺少的属性的名称

演示:


目前还没有统一的方法来做到这一点。该功能已在中提出
目前还没有统一的方法。该功能已在中提出
它仍然是草稿

不,没有。为什么不知道要访问的属性?即使您使用例如
getattr
动态执行此操作,您也有
name
参数。@jonrsharpe如果
a
中未定义
hi
,我想做的是抑制此错误。另一方面,如果a中定义了
hi
,则它可能在内部引发AttributeError,在这种情况下,我希望进一步传播此错误(在我的except块中重新引发)。如果已定义,则不会出现错误。能否给出一个具体的用例?@jornsharpe如果定义了
hi
,并且抛出了AttributeError本身(在它的主体中),那么就无法区分AttributeError是由于缺少
hi
还是由于缺少
hi
中所需的其他内容。我需要解析错误中的错误消息来理解它。这里有一个演示:我指的是你实际上试图解决的问题,而不是那些做作的东西。但是你有你喜欢的答案,所以没关系。不,没有。为什么不知道要访问的属性?即使您使用例如
getattr
动态执行此操作,您也有
name
参数。@jonrsharpe如果
a
中未定义
hi
,我想做的是抑制此错误。另一方面,如果a中定义了
hi
,则它可能在内部引发AttributeError,在这种情况下,我希望进一步传播此错误(在我的except块中重新引发)。如果已定义,则不会出现错误。能否给出一个具体的用例?@jornsharpe如果定义了
hi
,并且抛出了AttributeError本身(在它的主体中),那么就无法区分AttributeError是由于缺少
hi
还是由于缺少
hi
中所需的其他内容。我需要解析错误中的错误消息来理解它。这里有一个演示:我指的是你实际上试图解决的问题,而不是那些做作的东西。但是你有你喜欢的答案,所以没关系。@anton你有,它说“
AttributeError
:target,attribute”@anton你有,它说“
AttributeError
:target,attribute”
class A:
    def f(self):
        print('in A')


class B:
    pass


class C:
    def f(self):
        print('in C')
        raise AttributeError()


def call_f(o):
    try:
        o.f()
    except AttributeError as e:
        # instead of e.args[0].endswith("'f'") it would be nice to do
        # e.missing_attribute == 'f'
        if e.args and e.args[0].endswith("'f'"):
            print(e.args) # prints ("'B' object has no attribute 'f'",)
        else: raise

if __name__ == '__main__':
    a = A()
    b = B()
    c = C()

    call_f(a)
    call_f(b)
    call_f(c)