2011-08-30 6 views
3

잘못된 내부 상태 인 동안 개체가 삭제되면 경고 로그를 작성하려면 __del__()을 사용합니다 (이에 대해 분노하지 마십시오).호출되지 않은 __del __() 디버그 방법

테스트를 시도했지만 del my_object을 테스트에 사용했지만 __del__()이 호출되지 않은 것 같습니다.

__del__()'s reference은 이러한 상황이 발생할 수있는 3 가지 상황에 대해 경고하지만 디버깅 방법에 대한 단서는 제공하지 않습니다.

그래서 ... 어떻게 디버깅을해야합니까?

+0

@agf - 네, 어떻게 요? (많은 코드를 거치지 않고) – Jonathan

+0

코드를 제공해야합니다. –

+5

간단합니다. 컨텍스트 관리자를 사용하여'__del__'을 사용하지 마십시오. –

답변

4

에 제공하는 콜백의 출력을 볼 수 있습니다, 다음 뛰어난 적어도 하나의 다른있다 myObject를 참조하십시오. 나는 당신이 목록에 넣었거나 dict을 넣었거나, 또는 이 아니고이 아닌 객체를 복사하고, 원래의 두 번째 참조를 저장한다고 생각하고있다. 심지어 일 : 클래스의 __init__ 방법 또는 __new__ 방법은 몇 가지 클래스 수준의 캐시 또는 구조로 새로운 인스턴스를 저장하는 경우

myObject = MyObjectClassWith__del__() 
del myObject 

는 반드시 __del__를 호출하지 않을 수 있습니다.

결론 : 코드를 검사하거나 다른 대답에 게시 된 weakref 또는 gc 메서드를 사용하여 다른 참조를 확인하십시오.

3

글쎄, gc to collect 개체를 강제로 시도 할 수 있습니다. 개체에 대한 참조가 여전히 있고 가비지 수집을 방해 할 수있는 개체를 찾으려면 gc.get_referrersgc.get_referents으로 재생하십시오. 직접 del myObject를 호출 할 때 __del__가 호출되지 않을 경우

+1

'gc' 모듈은'__del__' 메쏘드를 가진 객체를 수집하지 않으므로'gc.collect()'를 호출하면 그것을 수집하지 않습니다. _may_ 할 일은 그 객체를'gc.garbage'에 착륙시키는 것입니다. –

4

당신은 weakref로 의심되는 물체 사이의 모든 참조를 변경하고 weakref.ref