Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 16  [17]  18  19  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
13210정성태1/5/20234335Windows: 219. 윈도우 x64의 경우 0x00000000`7ffe0000 아래의 주소는 왜 사용하지 않을까요?
13209정성태1/4/20234245Windows: 218. 왜 윈도우에서 가상 메모리 공간은 64KB 정렬이 된 걸까요?
13208정성태1/3/20234220.NET Framework: 2086. C# - Windows 운영체제의 2MB Large 페이지 크기 할당 방법파일 다운로드1
13207정성태12/26/20224480.NET Framework: 2085. C# - gpedit.msc의 "User Rights Assignment" 특권을 코드로 설정/해제하는 방법파일 다운로드1
13206정성태12/24/20224715.NET Framework: 2084. C# - GetTokenInformation으로 사용자 SID(Security identifiers) 구하는 방법 [3]파일 다운로드1
13205정성태12/24/20225029.NET Framework: 2083. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용 (2)파일 다운로드1
13204정성태12/22/20224349.NET Framework: 2082. C# - (LSA_UNICODE_STRING 예제로) CustomMarshaler 사용법파일 다운로드1
13203정성태12/22/20224521.NET Framework: 2081. C# Interop 예제 - (LSA_UNICODE_STRING 예제로) 구조체를 C++에 전달하는 방법파일 다운로드1
13202정성태12/21/20224933기타: 84. 직렬화로 설명하는 Little/Big Endian파일 다운로드1
13201정성태12/20/20225512오류 유형: 835. PyCharm 사용 시 C 드라이브 용량 부족
13200정성태12/19/20224376오류 유형: 834. 이벤트 로그 - SSL Certificate Settings created by an admin process for endpoint
13199정성태12/19/20224610개발 환경 구성: 656. Internal Network 유형의 스위치로 공유한 Hyper-V의 VM과 호스트가 통신이 안 되는 경우
13198정성태12/18/20224530.NET Framework: 2080. C# - Microsoft.XmlSerializer.Generator 처리 없이 XmlSerializer 생성자를 예외 없이 사용하고 싶다면?파일 다운로드1
13197정성태12/17/20224429.NET Framework: 2079. .NET Core/5+ 환경에서 XmlSerializer 사용 시 System.IO.FileNotFoundException 예외 발생하는 경우파일 다운로드1
13196정성태12/16/20224632.NET Framework: 2078. .NET Core/5+를 위한 SGen(Microsoft.XmlSerializer.Generator) 사용법
13195정성태12/15/20225144개발 환경 구성: 655. docker - bridge 네트워크 모드에서 컨테이너 간 통신 시 --link 옵션 권장 이유
13194정성태12/14/20225197오류 유형: 833. warning C4747: Calling managed 'DllMain': Managed code may not be run under loader lock파일 다운로드1
13193정성태12/14/20225288오류 유형: 832. error C7681: two-phase name lookup is not supported for C++/CLI or C++/CX; use /Zc:twoPhase-
13192정성태12/13/20225326Linux: 55. 리눅스 - bash shell에서 실수 연산
13191정성태12/11/20226213.NET Framework: 2077. C# - 직접 만들어 보는 SynchronizationContext파일 다운로드1
13190정성태12/9/20226720.NET Framework: 2076. C# - SynchronizationContext 기본 사용법파일 다운로드1
13189정성태12/9/20227468오류 유형: 831. Visual Studio - Windows Forms 디자이너의 도구 상자에 컨트롤이 보이지 않는 문제
13188정성태12/9/20226192.NET Framework: 2075. C# - 직접 만들어 보는 TaskScheduler 실습 (SingleThreadTaskScheduler)파일 다운로드1
13187정성태12/8/20226072개발 환경 구성: 654. openssl - CA로부터 인증받은 새로운 인증서를 생성하는 방법 (2)
13186정성태12/6/20224627오류 유형: 831. The framework 'Microsoft.AspNetCore.App', version '...' was not found.
13185정성태12/6/20225586개발 환경 구성: 653. Windows 환경에서의 Hello World x64 어셈블리 예제 (NASM 버전)
... 16  [17]  18  19  20  21  22  23  24  25  26  27  28  29  30  ...