복붙노트

[PYTHON] 파이썬에서 "#ifdef"를 어떻게 구현합니까?

PYTHON

파이썬에서 "#ifdef"를 어떻게 구현합니까?

Programming in C 코드 섹션은 디버깅 목적으로 만 사용됩니다 (로깅 명령 등). 이러한 문은 다음과 같이 #ifdef 전처리 지시문을 사용하여 프로덕션 환경에서 완전히 비활성화 될 수 있습니다.

 #ifdef MACRO

 controlled text

 #endif /* MACRO */

파이썬에서 비슷한 것을하는 가장 좋은 방법은 무엇입니까?

해결법

  1. ==============================

    1.로깅 메소드를 비활성화하려면 로깅 모듈을 사용하십시오. 로그 수준이 디버그 문을 제외하도록 설정되어 있으면 logging.debug는 no-op에 매우 가깝습니다 (로그 수준을 확인하고 로그 문자열을 보간하지 않고 반환 함).

    로깅 메소드를 비활성화하려면 로깅 모듈을 사용하십시오. 로그 수준이 디버그 문을 제외하도록 설정되어 있으면 logging.debug는 no-op에 매우 가깝습니다 (로그 수준을 확인하고 로그 문자열을 보간하지 않고 반환 함).

    특정 변수에 대한 바이트 코드 컴파일 타임 조건에 실제로 코드 덩어리를 제거하려는 경우 유일한 옵션은 매우 수수께끼없는 __debug__ 전역 변수입니다. 이 변수는 -O 플래그가 파이썬에 전달되지 않으면 (또는 PYTHONOPTIMIZE가 환경에서 비어 있지 않은 것으로 설정된 경우) True로 설정됩니다.

    if 문에서 __debug__가 사용되면 실제로 if 문은 True 분기로 컴파일됩니다. 이 특별한 최적화는 파이썬이 얻은 것처럼 전 처리기 매크로에 가깝습니다.

    매크로와 달리 if의 두 가지 분기에서 구문 적으로 올바른 코드 여야합니다.

    __debug__가 어떻게 작동하는지 보여주기 위해 다음 두 가지 기능을 고려하십시오.

    def f():
        if __debug__: return 3
        else: return 4
    
    def g():
        if True: return 3
        else: return 4
    

    이제 dis와 함께 그들을 확인하십시오 :

    >>> dis.dis(f)
      2           0 LOAD_CONST               1 (3)
                  3 RETURN_VALUE        
    >>> dis.dis(g)
      2           0 LOAD_GLOBAL              0 (True)
                  3 JUMP_IF_FALSE            5 (to 11)
                  6 POP_TOP             
                  7 LOAD_CONST               1 (3)
                 10 RETURN_VALUE        
            >>   11 POP_TOP             
    
      3          12 LOAD_CONST               2 (4)
                 15 RETURN_VALUE        
                 16 LOAD_CONST               0 (None)
                 19 RETURN_VALUE        
    

    보시다시피, f 만 "최적화 됨"입니다.

  2. ==============================

    2.Python def와 class에서 두 개의 정규 실행 문이 있다는 것을 이해하는 것이 중요합니다 ...

    Python def와 class에서 두 개의 정규 실행 문이 있다는 것을 이해하는 것이 중요합니다 ...

    import os
    
    if os.name == "posix":
        def foo(x):
            return x * x
    else:
        def foo(x):
            return x + 42
    ...
    

    따라서 C 및 C ++의 전 처리기로 수행하는 작업을 수행하려면 일반 Python 언어를 사용할 수 있습니다.

    파이썬 언어는 근본적으로 C 및 C ++과 근본적으로 다르다. 왜냐하면 "컴파일 시간"에 대한 개념이 없기 때문에 "파싱 타임"(소스 코드를 읽을 때)과 "런타임"은 구문 분석 된 코드 (일반적으로 대부분 정의 문으로 구성되어 있지만 실제로는 임의의 파이썬 코드 임)가 실행됩니다.

    나는 "구문 분석 시간"이라는 용어를 사용하고 있는데 기술적으로 소스 코드가 변환에서 읽힐 때 바이트 코드에 대한 전체 컴파일은 C 및 C ++ 컴파일의 의미가 다르고 예를 들어 함수 정의가 해당 단계에서 발생하기 때문에 대신 파이썬에서 런타임에 발생합니다).

    C와 C ++의 #include (파이썬에서의 임포트)는 컴파일 타임 (컴파일) 시간이 아니라 런타임에 실행되는 정규형 문이므로 일반 파이썬 안에 배치 할 수 있습니다. 예를 들어 일반적인 선택적 파이썬 라이브러리가 시스템에없는 경우 일부 기능에 대한 대체 정의를 제공하는 try 블록 내부로 가져 오는 것이 일반적입니다.

    마지막으로 파이썬에서는 런타임에서 새로운 함수와 클래스를 처음부터 소스 코드에 넣지 않고도 exec를 사용하여 만들 수 있다는 점에 유의하십시오. 클래스와 함수는 실제로는 단지 일반 객체이기 때문에 코드를 사용하여 직접 객체를 어셈블 할 수도 있습니다 (단, 일반적으로 클래스에 대해서만 수행됩니다).

    def 및 class 정의를 고려하고 "static"으로 import 문을 가져 오는 대신 Python 코드의 정적 분석을 수행하여 의심되는 부분에 대한 경고를 생성하거나 자체적으로 포함되지 않는 배포 가능한 패키지를 만들 수있는 도구가 있습니다 프로그램을 실행하기 위해 시스템에 특정 Python을 설치해야합니다. 그러나 파이썬이이 영역에서 C 또는 C ++보다 더 동적이라고 생각할 수 있어야하며, 자동 분석이 실패하는 부분에 예외를 추가 할 수도 있습니다.

  3. ==============================

    3.내가 아는 한 실제 if 문을 사용해야합니다. 전 처리기가 없으므로 전 처리기 지시문에 아날로그가 없습니다.

    내가 아는 한 실제 if 문을 사용해야합니다. 전 처리기가 없으므로 전 처리기 지시문에 아날로그가 없습니다.

    편집 : 사실,이 질문에 대한 답이 더 밝아 질 것 같습니다 : 파이썬에서 전 처리기 지시문을 어떻게 처리 하시겠습니까?

    아마도 __debug__이라는 특수 변수가 있는데, if 문과 함께 사용하면 한 번 평가 된 다음 실행 중에 다시 평가되지 않습니다.

  4. ==============================

    4.다음은 Python Tk 프로그램을 위해 파이썬 2와 3을 구별하는 예제입니다 :

    다음은 Python Tk 프로그램을 위해 파이썬 2와 3을 구별하는 예제입니다 :

    
    import sys
    if sys.version_info[0] == 3:
        from tkinter import *
        from tkinter import ttk
    else:
        from Tkinter import *
        import ttk
    
    """ rest of your code """
    

    희망 그 유용한 일러스트입니다.

  5. ==============================

    5.내가 알고있는 직접적인 동등 물은 없으므로 전처리기를 사용하여 해결할 때 사용한 문제를 축소하고 다시 고려해야 할 수 있습니다.

    내가 알고있는 직접적인 동등 물은 없으므로 전처리기를 사용하여 해결할 때 사용한 문제를 축소하고 다시 고려해야 할 수 있습니다.

    진단 로깅 일 뿐이라면, 원하는대로 모든 것을 다룰 수있는 포괄적 인 로깅 모듈이 있습니다.

    http://docs.python.org/library/logging.html

    전처리 기는 또 무엇을 사용합니까? 테스트 구성? 이를위한 설정 모듈이 있습니다.

    http://docs.python.org/library/configparser.html

    다른 건 없니?

  6. ==============================

    6.#ifdef를 사용하여 현재 파일 위에있는 범위에서 정의 된 변수를 확인하는 경우 예외를 사용할 수 있습니다. 예를 들어, ipython과 ipython 외부에서 다르게 실행하려는 스크립트가 있습니다 (예 : 플롯 대 세이브 플롯 표시). 그래서 나는

    #ifdef를 사용하여 현재 파일 위에있는 범위에서 정의 된 변수를 확인하는 경우 예외를 사용할 수 있습니다. 예를 들어, ipython과 ipython 외부에서 다르게 실행하려는 스크립트가 있습니다 (예 : 플롯 대 세이브 플롯 표시). 그래서 나는

         ipy = False
         try:
            ipy = __IPYTHON__
         except NameError:
            pass
    

    이것은 변수 ipy를 남겨 둡니다.이 변수는 __IPYTHON__이 현재 스크립트의 범위에서 선언되었는지 여부를 알려줍니다. 이것은 Python에서 #ifdef 함수에 대해 알고있는 가장 근접한 병렬 함수입니다.

    ipython의 경우 이것은 훌륭한 솔루션입니다. 호출 스크립트가 변수 값을 설정하고 그에 따라 내부 스크립트가 확인하는 다른 컨텍스트에서 유사한 구문을 사용할 수 있습니다. 물론 이것이 의미가 있는지 여부는 특정 사용 사례에 따라 달라집니다.

  7. ==============================

    7.직접 시도하지는 않았지만 https://code.google.com/p/pypreprocessor/는 어떻습니까?

    직접 시도하지는 않았지만 https://code.google.com/p/pypreprocessor/는 어떻습니까?

  8. from https://stackoverflow.com/questions/12524570/how-do-you-implement-ifdef-in-python by cc-by-sa and MIT license