Microsoft MVP성태의 닷넷 이야기
스크립트: 30. 파이썬 __debug__ 플래그 변수에 따른 코드 실행 제어 [링크 복사], [링크+제목 복사],
조회: 24085
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
 

파이썬 __debug__ 플래그 변수에 따른 코드 실행 제어

C#의 경우 매크로 상수나 Conditional 특성을 이용해 "DEBUG", "TRACE" 등의 문자열을 지정하면 해당 매크로가 정의되었을 때만 실행에 포함되는 메서드를 만들 수 있습니다.

파이썬에는 이와 유사하게 최적화 환경에 따라 True/False의 값을 갖는 __debug__ 플래그 변수가 제공되는데요, 일례로 다음과 같이 사용할 수 있습니다.

def main():
    print("run test.py", __debug__)

    if __debug__:
        print("debug run")
    else:
        print("release run")


main()

c:\temp> python test.py
run test.py True
debug run

c:\temp> python -O test.py
run test.py False
release run

그리고, 이 특별한 변수에 대해 다음의 책을 보면 좀 더 재미있는 설명이 있습니다.

파이썬 완벽 가이드
; https://coupa.ng/b8a23t

인터프리터에서 __debug__ 변수가 구현되는 방식은 최적화되어 있어서 추가적인 if문의 제어흐름 로직은 코드에 실제로 포함되지 않는다.


그러니까 단순히 if 문을 매번 실행 시마다 __debug__ 변수의 조건을 체크해 분기하는 것이 아니고, 아예 중간 언어(Python ByteCode)로의 변환 단계에서 명령어 자체의 포함 여부가 결정된다는 것입니다. 혹시 이를 확인할 수 있는 방법이 있을까요? ^^ 다행히 dis 패키지를 사용해 그 결과를 볼 수 있습니다.

from dis import dis


def main():
    print("run test.py", __debug__)

    if __debug__:
        print("debug run")
    else:
        print("release run")


main()

dis(main)

그래서 다음과 같이 사용해 -O 옵션에 따른 해당 main 함수의 중간 언어를 살펴보면,

c:\temp> python test.py
run test.py True
debug run
  6           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('run test.py')
              4 LOAD_CONST               2 (True)
              6 CALL_FUNCTION            2
              8 POP_TOP

  9          10 LOAD_GLOBAL              0 (print)
             12 LOAD_CONST               3 ('debug run')
             14 CALL_FUNCTION            1
             16 POP_TOP
             18 LOAD_CONST               0 (None)
             20 RETURN_VALUE

c:\temp> python -O test.py
run test.py False
release run
  6           0 LOAD_GLOBAL              0 (print)
              2 LOAD_CONST               1 ('run test.py')
              4 LOAD_CONST               2 (False)
              6 CALL_FUNCTION            2
              8 POP_TOP

 11          10 LOAD_GLOBAL              0 (print)
             12 LOAD_CONST               3 ('release run')
             14 CALL_FUNCTION            1
             16 POP_TOP
             18 LOAD_CONST               0 (None)
             20 RETURN_VALUE

보는 바와 같이 if 문으로 인한 COMPARE_OP 자체가 없습니다.




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]







[최초 등록일: ]
[최종 수정일: 10/7/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 181  182  183  [184]  185  186  187  188  189  190  191  192  193  194  195  ...
NoWriterDateCnt.TitleFile(s)
498정성태5/31/200724248Windows: 26. 스마트 카드 암호 바꾸는 방법.
497정성태5/31/200728312오류 유형: 36. SQL 2005 - DB 속성창 띄울 때 오류
496정성태5/29/200726162VS.NET IDE: 45. VS.NET 2005/Orcas 솔루션 파일과 UAC
495정성태5/28/200728701VS.NET IDE: 44. Orcas와 VS.NET 2005의 혼합 개발 [1]
494정성태5/26/200732543오류 유형: 35. 비스타 탐색기 - 특정 파일을 오른쪽 마우스 클릭했을 때, 비정상 종료되는 문제
493정성태5/26/200732348오류 유형: 34. Windows Server 2008 : CA 인증서 발급 실패
492정성태5/23/200731454.NET Framework: 89. ManagedThreadId - 두 번째 이야기 [5]파일 다운로드1
491정성태5/21/200731636.NET Framework: 88. ManagedThreadId ? [4]
490정성태5/19/200740325오류 유형: 33. error MSB6003: SxS DLL 로딩 오류 [2]
489정성태5/14/200728110.NET Framework: 87. .NET 2.0에서 C# 3.0 기능 사용하기
488정성태5/14/200726358Windows: 25. Multiple Input Queues
487정성태4/24/200732346VC++: 32. VC++에서 bool이 가지는 의미 [3]
486정성태3/22/200730970Windows: 24. DreamScene과 DWM(Desktop Window Manager)의 관계 [1]
485정성태3/17/200726140오류 유형: 32. VS.NET 2005 - x64 환경에서의 mixed 디버깅 환경 구성
484정성태3/17/200725144오류 유형: 31. SQL Compact Edition 설치 후 오류
483정성태3/17/200746673오류 유형: 30. x64 환경: .NET + COM 프로젝트 실행 시 오류 - 80040154 [2]
482정성태3/17/200736354Team Foundation Server: 17. 팀 프로젝트 접속 및 사용
481정성태3/17/200730259Team Foundation Server: 16. 팀 프로젝트 읽기 전용 사용자 등록
480정성태3/14/200728745.NET Framework: 86. GC(Garbage Collector)의 변화
479정성태3/14/200732331개발 환경 구성: 25. D820 - ReadyBoost 구동
478정성태3/14/200731949개발 환경 구성: 24. D820 고주파음 문제
477정성태3/14/200741576개발 환경 구성: 23. 비스타 x64 버전에서 서명되지 않은 드라이버 사용 [4]
476정성태3/9/200736720개발 환경 구성: 22. D820 노트북 - 설치 및 BitLocker 구성 [1]
475정성태3/6/200731016.NET Framework: 85. 공용 프로퍼티 자동 생성
474정성태3/5/200729102.NET Framework: 84. Lambda 표현식 응용 사례 [1]
473정성태3/4/200736459디버깅 기술: 14. TFS 오류 추적(TF53010, TF14105)
... 181  182  183  [184]  185  186  187  188  189  190  191  192  193  194  195  ...