1

當我要求一個不存在的python對象的屬性時,我得到一個AttributeError,但是我沒有在錯誤對象的字段中找到請求的屬性的名稱。提及請求屬性名稱的唯一地方是錯誤的成員args如何確定AttributeError引用哪個屬性?

在我看來,解析錯誤消息以獲取缺失屬性的名稱有點麻煩。有沒有什麼辦法可以在不解析錯誤信息的情況下獲取缺失屬性的名稱?

演示:

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) 
+0

不,沒有。你爲什麼不知道你想要訪問的屬性?即使你正在動態地使用例如'getattr',你有'name'參數。 – jonrsharpe

+0

@jonrsharpe我想要做的就是在'a'中沒有定義'hi'時抑制錯誤。另一方面,如果'hi' _is_在a中定義,那麼它可能會引發AttributeError,在這種情況下,我想進一步傳播這個錯誤(在我的except塊中重新提升)。 –

+0

如果已定義,則不會有*錯誤。能給出一個具體的用例嗎? – jonrsharpe

回答

0

沒有統一的辦法做到這一點現在。該功能已建議PEP 473 仍處於草稿形式

+0

@anton你有,它說*「'AttributeError':目標,屬性」* – jonrsharpe

相關問題