2011-10-04 1 views
1

flush() 메서드를 사용하여 파이썬 스크립트에 대한 사용자 지정 로깅 클래스가 있습니다. 목록의 내용은 print()입니다.객체 .__ del __ (self)는 로깅 클래스를 플러시하는 가장 적절한 장소입니까?

로그를 플러시하지 않고 프로그램이 종료되는 경우 __del__() 메서드에 flush() 메서드를 포함하고자합니다. the documentation 상태에서 그러나, 참고

[...] 때 ()는 모듈 (프로그램의 실행이 완료 될 때 등), 다른 전역에 의해 참조 삭제하는 것에 응답하여 호출 될 del() 메소드가 이미 삭제되었거나 철거 중입니다 (예 : 가져 오기 기계가 종료 됨).

누구나 다른 방법을 권장할까요? 그렇다면 그 이유는 무엇입니까?

+0

어디로 인쇄 하시겠습니까? 하지만 일반적으로 파이널 라이저를 사용하는 것은 매우 나쁜 생각입니다. 주로 비 결정적 순서, 사이클의 최종 결정의 비 결정적인 시간, 파이널 라이저가있는 사이클이 전혀 깨지지 않을 가능성 등 수많은 함정 때문에. 디자인에 "필요"하다고하더라도, 기회는 __del__이 아닌 깨진 디자인입니다. – delnan

+0

'os.print()'- 백업이지만. 아이디어는 프로그램을 종료하기 전에 flush()하는 것입니다. 클래스의 비정상적인 프로그램 종료에 대한 경계를 포함시키는 것이 적절한 지 궁금합니다. 그것이 효과가 있다면 디버깅에 도움이 될 것입니다. –

답변

1

당신은이 로거를 context manager으로 만들 수 있습니다. 그것은 비정상 종료의 경우에도 여전히 플러시되지 않지만, 거의 발생하지 않을 것입니다. 그러나 __del__은 정상 종료시에도 오브젝트에서 호출되지 않을 수 있습니다.

로커는 매우 포괄적 인 문맥이므로 with 문을 사용할 때 적합하지 않은 항목 중 하나 일 수 있습니다. 따라서 컨텍스트 관리자가 잘 맞는지 확실하지 않습니다.

+0

직접 응답이 없으면 Python 인터프리터의 예외 처리 프로세스를 설명하는 자원 (인쇄물 또는 전자)을 알고 계십니까? –

관련 문제