1

존재하지 않는 파이썬 개체의 특성을 요청하면 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'_is_가 a에 정의되어 있으면 AttributeError가 내부에 들어올 수 있습니다.이 경우에는이 오류를 더 전파하려고합니다 (내 except 블록에서 다시 올리기). –

+0

정의 된 경우 오류가 * * 발생하지 않습니다. 구체적인 유스 케이스를 줄 수 있을까요? – jonrsharpe

답변

0

현재 해당 작업을 수행하는 통일 된 방법은 없습니다. 이 기능은 아직 초안 형태 인 PEP 473 에 제안되었습니다.

+0

@anton 당신은 가지고있다, 그것은 말한다 * "'AttributeError' : target, attribute"* – jonrsharpe

관련 문제