문제

방법은 없는 다음을 수행하는 전처리기는 지시어에서는 파이썬?

#if DEBUG

< do some code >

#else

< do some other code >

#endif
도움이 되었습니까?

해결책

거기 있습니다 __debug__, 이는 컴파일러가 전처리하는 특별한 값입니다.

if __debug__:
  print "If this prints, you're not running python -O."
else:
  print "If this prints, you are running python -O!"

__debug__ 컴파일러에 의해 상수 0 또는 1으로 교체되며 Optimizer는 if 0: 출처가 해석되기 전의 선.

다른 팁

내가 쓴이라는 전처리기 pypreprocessor 는 정확하게 당신을 설명하고 있습니다.

소스와 문서를 사용할 수 있습니다 on GitHub.

패키지 다운로드할 수 있습니다/를 통해 설치 PyPI.

여기에 예를 달성하신을 설명하고 있습니다.

from pypreprocessor import pypreprocessor

pypreprocessor.parse()

#define debug

#ifdef debug
print('The source is in debug mode')
#else
print('The source is not in debug mode')
#endif

pypreprocessor 의 능력보다 더 많은 on-the-fly 전처리.더보를 사용 사례를 확인 프로젝트에서 Google 코드입니다.

업데이트:더 많은 정보에 pypreprocessor

방법은 내가 달성하는 전처리은 간단합니다.에서 예를 들어,위의 전처리기는 수입품은 pypreprocessor 체에서 만들어진 pypreprocessor 모듈이 있습니다.를 호출할 때 parse()에 전처리기는 그것을 자기 소비하는 파일이 가져온으로 생성 temp 의 복사본을 자체는 주석으로 모든 코드는 전처리기(피하는 전처리기 호출에서 자신을 재귀적으로 무한 루프에서)및 주석을 모두 사용하지 않는 부분이 있습니다.

주석으로 처리인은 반대로,제거,을 유지하기 위해 필요한 라인 번호에서 오류 추적 메 사용하길 원하시는 경우 예외가 발생하거나 충돌합니다.고 나라로 다시 작성하는 오류를 추적하는 보고서를 반영한 적절한 파일의 이름은 모듈을 추락했다.

그런 다음,생성된 파일을 포함하는 postprocessed 코드에서 실행됩니다.

이 거꾸로 이 방법을 사용하여 통해 추가의 무리하면 문이 인라인 코드에서는,없을 것이 실행을 평가하고 낭비되는 시간 쓸모없는 문이기 때문에 주석 부분의 코드는 제외에서 컴파일합니다.pyc 파일이 있습니다.

단점(그리고 내 원래의 이유로 만들기 위한 모듈)는 실행할 수 없습니다 모두 파이썬 2x 및 python3 배에서 같은 파일이기 때문에 파이 통역을 실행하는 전체 구문을 확인하기 전에 실행 코드와를 거부하는 모든 버전별 코드기 전에는 전처리기는 실행할 수 있::한숨::.나의 본래 목표는 것이었을 개발할 수 있 3x2x 및 코드 side-by-side 에서 같은 파일을 만드는 버전은 특정한 바이트 코드는 무엇인지에 따라 그것에서 실행.

어느 방법으로,전처리 모듈은 여전히 매우 유용한 구현에 대한 일반적인 c-일 전처리 기능입니다.뿐만 아니라,전처리기는 출력할 수 있는 postprocessed 코드를 나중에 사용하기 위해 파일에 당신이 원하는 경우.

또한,당신이 원하는 경우를 생성하는 버전이 있는 모든의 전처리기는 지시어뿐만 아니라 어떤 의#ifdefs 제외되는 제거 그것은 간단한 설정으로 국기에서는 전처리기 코드를 호출하기 전에 parse().이것을 제거하는 원치 않는 코드 버전에서 특정한 소스 파일을 한 단계는 프로세스(vs 크롤링을 통해 코드고 제거하는 경우 문 manually).

나는 당신 이이 대답을 싫어할 것 같아요. 파이썬에서 그렇게하는 방식은입니다

# code here
if DEBUG:
   #debugging code goes here
else:
   # other code here.

Python은 통역사이므로 적용 할 전처리 단계가 없으며 특수 구문을 갖는 데 특별한 이점이 없습니다.

Python에서 전처리기를 사용할 수 있습니다. 빈 디렉토리의 CPP (C- 프로세서)를 통해 스크립트를 실행합니다. 그러나 나는 LUA로 이것을 해냈으며 쉬운 해석의 이점은 더 복잡한 편집 IMHO보다 중요했습니다.

일반 언어 구성 만 사용할 수 있습니다.

DEBUG = True
if DEBUG:
  # Define a function, a class or do some crazy stuff
  def f():
    return 23
else:
  def f():
    return 42

대안적인 방법은 Bash 스크립트를 사용하여 디버깅과 관련된 코드의 일부를 주석하는 것입니다. 아래는 '#debug'문이있는 줄을 언급하는 예제 스크립트입니다. 또한 이러한 주석 마커를 다시 제거 할 수 있습니다.

if [ "$1" == "off" ]; then
  sed -e '/^#/! {/#DEBUG/ s/^/#/}' -i *.py
  echo "Debug mode to $1"
elif [ "$1" == "on" ]; then
  sed -e '/#DEBUG/ s/^#//' -i *.py
  echo "Debug mode to $1"
else
  echo "usage: $0 on | off"
fi
  • 파이썬은 배열에서 요소를 제거 할 수없는 경우.
  • C 프리 컴파일러는 #를 처리하지 않습니다! 또는 필요에 따라 #로 시작하는 다른 줄.
  • pypreprocessor는 파이썬 특이한 것 같습니다

대신 공통 M4를 사용하십시오.

ifelse(DEBUG,True,dnl`
  < do some code >
dnl,dnl`
  < do some other code >dnl
')

ifelse(
  M4_CPU,x86_64,`
    < do some code specific for M4_CPU >
',M4_CPU,arm,`
    < do some code specific for M4_CPU >
',M4_CPU,ppc64le,`
    < do some code specific for M4_CPU >
')

ifelse(
  M4_OS,windows,`
    < do some code specific for M4_OS >
  ',M4_OS,linux,`
    < do some code specific for M4_OS >
  ',M4_OS,android,`
    < do some code specific for M4_OS >
')

M4 -D 디버그 = true -d m4_os = android -d m4_cpu = arm test.py.m4> test.py

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top