[python] 디버깅을 위해서만 print 문 사용

저는 늦게 파이썬으로 많은 코딩을했습니다. 그리고 저는 이전에 작업하지 않았던 데이터로 작업하고 있으며, 이전에는 볼 수 없었던 공식을 사용하고 거대한 파일을 처리했습니다. 이 모든 것이 제대로 진행되고 있는지 확인하고 실패 지점을 식별하기 위해 많은 인쇄 문을 작성하게했습니다. 그러나 일반적으로 너무 많은 정보를 출력하는 것은 좋은 습관이 아닙니다. 디버깅하려는 경우에만 print 문을 사용하고 인쇄하지 않으려면 건너 뛰도록하려면 어떻게해야합니까?



답변

logging모듈은 당신이 원하는 수있는 모든 것을 갖추고 있습니다. 처음에는 과도 해 보일 수 있지만 필요한 부분 만 사용하십시오. 내가 사용하는 것이 좋습니다 것 logging.basicConfig로깅 수준 전환 stderr하고 간단한 로그 방법 , debug, info, warning, errorcritical.

import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))


답변

이를 수행하는 간단한 방법은 로깅 함수를 호출하는 것입니다.

DEBUG = True

def log(s):
    if DEBUG:
        print s

log("hello world")

그런 다음 DEBUG로깅을 사용하거나 사용하지 않고 코드 의 값을 변경 하고 실행할 수 있습니다.

표준 logging모듈에는 이에 대한보다 정교한 메커니즘이 있습니다.


답변

인쇄 대신 로깅 내장 라이브러리 모듈을 사용하십시오 .

당신은 만들 Logger개체 (말을 logger), 당신은 디버그 프린트를 삽입 할 때마다 그 후, 당신은 넣어 :

logger.debug("Some string")

logger.setLevel프로그램 시작시 사용 하여 출력 레벨을 설정할 수 있습니다. DEBUG로 설정하면 모든 디버그가 인쇄됩니다. INFO 이상으로 설정하면 즉시 모든 디버그가 사라집니다.

또한 다른 수준 (정보, 경고 및 오류)에서 더 심각한 사항을 기록하는 데 사용할 수도 있습니다.


답변

먼저, 저는 파이썬의 로깅 프레임 워크를 두 번째로 지명 할 것 입니다. 그러나 사용 방법에 대해 약간주의하십시오. 특히 : 로깅 프레임 워크가 변수를 확장하도록 허용하고 직접 수행하지 마십시오. 예를 들어 다음 대신 :

logging.debug("datastructure: %r" % complex_dict_structure)

다음을 확인하십시오.

logging.debug("datastructure: %r", complex_dict_structure)

비슷해 보이지만 첫 번째 버전은 비활성화 된 경우에도 repr () 비용 이 발생하기 때문 입니다. 두 번째 버전은 이것을 피합니다. 마찬가지로, 직접 굴려도 다음과 같은 것을 제안합니다.

def debug_stdout(sfunc):
    print(sfunc())

debug = debug_stdout

다음을 통해 호출 :

debug(lambda: "datastructure: %r" % complex_dict_structure)

다시 한 번 다음을 수행하여 비활성화하면 오버 헤드를 피할 수 있습니다.

def debug_noop(*args, **kwargs):
    pass

debug = debug_noop

이러한 문자열을 계산하는 오버 헤드는 1) 계산에 비용이 많이 들거나 2) 디버그 문이 n ^ 3 루프 등의 중간에 있지 않는 한 중요하지 않습니다. 나는 그것에 대해 아무것도 알지 못합니다.


답변

나는 다른 사람에 대해 잘 모르겠지만, 내가 정의하는 데 사용했다 “글로벌 상수” ( DEBUG) 다음 전역 함수 ( debug(msg)인쇄 할) msg경우에만를 DEBUG == True.

그런 다음 다음과 같이 디버그 문을 작성합니다.

debug('My value: %d' % value)

… 그런 다음 단위 테스트를 선택하고 다시는하지 않았습니다! 🙂


답변