Microsoft MVP성태의 닷넷 이야기
스크립트: 30. 파이썬 __debug__ 플래그 변수에 따른 코드 실행 제어 [링크 복사], [링크+제목 복사],
조회: 17386
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 166  167  168  169  170  [171]  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
733정성태5/29/200931691.NET Framework: 139. WPF - "M/d/yyyy h:mm:ss tt" 형식으로만 날짜를 출력하는 문제
732정성태5/27/200926727Team Foundation Server: 32. 팀 빌드 오류 확인 방법
731정성태5/27/200921732Team Foundation Server: 31. 팀 빌드 스케줄 확인 방법
730정성태5/26/200927281VS.NET IDE: 63. Visual Studio 2010 - Parallel Stacks [1]
729정성태5/25/200926940.NET Framework: 138. InternalsVisibleTo와 Public Key 값
728정성태5/23/200937447.NET Framework: 137. C#에서 Union 구조체 다루기파일 다운로드1
727정성태5/22/200922404오류 유형: 82. 메서드가 많은 경우 프록시 클래스 생성 실패
726정성태5/21/200921950VS.NET IDE: 62. Visual Studio 2010 Beta1 버그 피드백 - EnC기능 오류 [1]
725정성태5/21/200925215VS.NET IDE: 61. Visual Studio 2010 베타1과 Visual Studio 2008의 혼합 개발 [2]
724정성태5/19/200939358.NET Framework: 136. 자바와 닷넷의 압축 호환파일 다운로드2
723정성태5/18/200933296.NET Framework: 135. C# - Deflate, GZip, Zip
722정성태5/18/200921843개발 환경 구성: 45. SQL 서버 2008 백업 구성 [2]
721정성태5/14/200927495오류 유형: 81. Package 실행 오류 - Error 15404
720정성태5/13/200924265오류 유형: 80. SQL Server 2008 - Package 실행 오류의 구체적인 원인 확인
719정성태5/12/200925384.NET Framework: 134. WPF - XBAP을 호스팅하고 있는 인터넷 익스플로러 인터페이스 구하기파일 다운로드1
717정성태5/11/200925693개발 환경 구성: 44. VHD 파일 크기 확장하는 방법 - 두 번째 이야기
714정성태5/7/200924221Windows: 45. Windows 7 RC와 함께 공개된 Windows Virtual PC 베타
713정성태4/30/200956013오류 유형: 79. DLL 'xxxxx.dll'을(를) 로드할 수 없습니다. [1]
712정성태4/28/200928621오류 유형: 78. Windows Vista/2008에서의 MSXML4.cab 파일 배포 문제
711정성태4/27/200928236개발 환경 구성: 43. Hyper-V VHD 파일 크기 확장하는 방법
710정성태4/26/200928795.NET Framework: 133. CallbackOnCollectedDelegate was detected [4]파일 다운로드1
709정성태4/24/200925021개발 환경 구성: 42. Windows Vista SP1에서 사용 가능한 Hyper-V 관리 도구
708정성태4/23/200929930.NET Framework: 132. ClickOnce 배포를 명령행 수작업 구성파일 다운로드1
707정성태4/22/200929513개발 환경 구성: 41. Hyper-V에 Linux 설치 - SUSE Linux Enterprise Server 11
706정성태4/21/200925384.NET Framework: 131. ClickOnce - 그룹화시켜 다운로드파일 다운로드1
705정성태4/20/200920936개발 환경 구성: 40. TFS2008 SP1의 DBTier에 SQL Server 2008 SP1 설치 [1]
... 166  167  168  169  170  [171]  172  173  174  175  176  177  178  179  180  ...