2014-12-16 2 views
0

기본적으로 전역 수준에서 사용할 수있게하려는 일부 개체가 있는데, 사용자가 실수로 변수 이름을 덮어 쓰는 경우이를 사용자에게 알려주고 싶습니다. 매우 일반적인 변수 이름을 가지고 있기 때문에 사용자에게이를 덮어 쓰는 경우 알림을 받고 싶습니다 (필요한 경우이 문제를 해결할 수 없습니다.).스크립트가 실행되기 전에 객체가 삭제되면 파이썬에서 어떻게 알릴 수 있습니까?

예를 들어, 사용자가 b=2을 수행하고 나중에 가비지 수집기가 스윕을 수행하면 b이 삭제되었다는 알림을 받고 싶습니다. 그러나 스크립트의 마지막에 이런 일이 발생하면 다른 모든 것이 가비지 수집 될 때 침묵해야합니다. 이러한 이유로 단순히 __del__ 메서드를 구현하는 것만으로는 충분하지 않습니다.

나는 weakref 모듈을 파고 들지만, 필자가 필요로하는 것은 아닙니다.

+0

사용자가 이러한 개체를 덮어 쓸 수있는 이유가 있습니까? 아니면 스크립트를 실행하는 동안 그들을 잠글 것이 바람직할까요? –

+0

그들을 잠그는 것이 좋지만 변수 이름이 중요합니다. 'b'라고하는 기본 객체가 살아 있다는 것만으로는 충분하지 않습니다.'b'는 그 객체를 가리켜 야합니다. – user3557216

+0

또한 함수 범위 내에서 다른 목적으로 변수 이름을 사용하는 것이 좋습니다. 이 변수가 '신성한'일 필요가있는 것은 전 세계적 차원에 불과합니다. – user3557216

답변

3

exec 또는 eval을 통해 외부 "신뢰할 수없는"코드를 실행하는 경우 덮어 쓰기 또는 삭제되는 것을 알려주는 맞춤 globals 개체를 전달할 수 있습니다. 특정 종류의 수정을 금지 할 수도 있습니다. 간단한 예로서

: 사용자 코드 x을 변경하려고 할 때

class readonly_dict(dict): 
    def __setitem__(self, key, value): 
     raise NotImplementedError 

exec "print x; x = 3" in readonly_dict(x = 10) 

이 10, 그 다음 NotImplementedError을 발생 인쇄한다. 필요에 맞게 __delitem____setitem__을 무시할 수 있습니다. 출구에서 __del__의 출력을 억제으로


: 당신이에서 register 기능을 사용할 수 있습니다 내장 된 소멸자 전에 실행 종료 훅을 등록하고 __del__ 침묵 플래그를 설정해야 할 atexit 모듈.

관련 문제