2014-10-01 4 views
2

파이썬에서 부작용을 디버그하는 효과적인 방법이 있습니까?효과적으로 파이썬에서 부작용을 디버그하는 방법은 무엇입니까?

예를 들어, list (또는 임의의 다른 가변 객체)가 함수의 인수로 전달되었습니다.

>>> some_list = [1,2] 
>>> some_function_with_huge_call_tree(some_list) 
>>> print some_list 
[2,1] 

어떻게 프로그램에서 목록이 되돌려 졌는지 판단하는 방법은 무엇입니까? 클래스 인스턴스의 멤버

>>> print obj.x 
foo 
>>> some_function_with_super_huge_call_tree(obj) 
>>> print obj.x 
bar 

을 변경되었습니다

하나 더 예를 들어, 클래스의 인스턴스가 인수로 전달?

pdb.break_on_change(some_list) # case 1 
pdb.break_on_change(obj.x) # case 2 

는 불행하게도, PDB 그런 기능이 없습니다 : 두 경우 모두

내가 이런 식으로 뭔가를 할 수 있습니다.

즉, 모든 경우에 공통된 해결책을 찾으려고합니다.

+0

변형 된 개체를 제어합니까? 함수를 아는 경우에는 예외를 throw하고 스택 추적을 검사 할 수 있습니다. – 5gon12eder

+1

목록의 경우, 튜플을주고 실패한 부분을 볼 수 있을까요? 보다 일반적으로, 쓰기 가능한 객체를 동일한 읽기 전용 객체로 바꾸십시오. – NPE

+0

좋아, 목록 나쁜 예입니다. 인수가 dict (또는 임의의 다른 가변 유형)이면? 모든 경우에 대한 일반적인 해결책을 찾으려고 노력합니다. – Pyt

답변

0

당신은 그것으로 무슨 일이 일어 났는지 알려주는 모의 객체를 넣을 수 있습니다.

다음은 변형 함수 속성이 호출되는 위치를 추적하는 최소한의 예제입니다.

def throw(*args, **kwargs): 
    raise AssertionError() 

class Mock(object): 

    def __init__(self, inner): 
     self.__inner = inner 

    def __getattr__(self, name): 
     if name == 'mutate': 
      return throw 
     return getattr(self.__inner, name) 

그런

some_function(Mock(obj)) 

some_function 여부를 obj를 돌연변이 밖으로 찾을 수에로 사용합니다.

이 예제에는 모의 인프라에서 정당하게 기대할 수있는 많은 기능이 없습니다. 아마도 최악의 경우, 그것은 마법을 지원하지 않습니다. 어쩌면 당신의 필요에 맞게 확장 할 수 있습니다. 실제로이 작업을 수행하는 라이브러리가 없다면 놀랄 것입니다.

관련 문제