2013-08-07 7 views
2

(단지 프레임의 주민) : 위의 경우파이썬 추적에서 로컬 속성을 인쇄하는 방법은 무엇입니까? 내가 마지막 프레임의 출력에 지역 주민을 traceback.print_exception을 수정

Traceback (most recent call last): 
    File "/home/aconrad/work/smlib.traceback/tests.py", line 287, in test_display_variable_that_is_not_local 
    f.boom() 
    File "/home/aconrad/work/smlib.traceback/tests.py", line 284, in boom 
    return ','.join(self.foo) 
TypeError 

    local variables: 
    - self: <tests.Foo object at 0x3233350> 

는 지역 주민은 내가 자기의 가치를 알고하지 않는만큼 유용하지 않다 .foo는 join() 함수를 깨뜨렸다. 나는 다음으로도 사용되는 속성과 값을 인쇄하는 내 사용자 지정 추적을 수정하고 싶습니다 : 나는 속성을 찾아 프레임의 지역 주민에 그들을 찾기 위해 AST 모듈을 사용하여 소스를 분석하기 시작

attributes: 
    - self.foo: 1 

. 위의 하나의 유스 케이스에서 작동하지만 소스 라인을 지원하기에는 너무 약합니다. 이것을 달성하는 가장 좋은 방법은 무엇입니까? 여기

내가 내 테스트 케이스에 사용되는 코드입니다 :

class Foo(object): 
    foo = 1 

    def boom(self): 
     return ','.join(self.foo) 

f = Foo() 
f.boom() 

답변

0

로컬 변수 목록에서 자기와 일치하는 경우는 속성과 현재 개체의 방법을 나열 할 수 있습니다

if and isinstance(current_var, object) and str(current_var) == 'self': # avoid to list every objects encountered... 
    print '\n'.join(["%s: %s" % (i, getattr(f, i)) for i in dir(f) if not i.startswit 
h('__')]) 

getattr(f, i)이 기능이 아닌지 확인하여 필터링 할 수 있습니다 (일부 줄은 boom: <bound method Foo.boom of <__main__.Foo object at 0x0000000001E2B908>>과 같은 것을 피하기 위해).

내가 생각한 최선의 해결책은 아니지만 문제를 해결해야합니다.

+0

응답 해 주셔서 감사합니다. Maxime! 비록 내가 오류를 일으킬 수있는 추적 소스에서 값을 표시하고 싶지만. 'self'는 문장의 일부가 아니기 때문에 자기를 바라보기 만하는 것이 아니라 '', join (something.foo) 문을 깨뜨린 것입니다. –

+0

마지막 줄을 구문 분석하여 사용 된 모든 식별자는'getattr()'와 함께 사용하면 어려울 것입니다. –