파이썬에서 전 처리기 지시문에 해당하는 것을 어떻게할까요?
Python에서 다음 전 처리기 지시문을 수행하는 방법이 있습니까?
#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로 대체되며 최적화 프로그램은 if 0:
소스가 해석되기 전에 모든 행 을 제거합니다 .
나는 당신이 설명하는 것을 정확히 수행하는 pypreprocessor라는 파이썬 전처리기를 작성했습니다.
소스 및 문서는 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 ()를 호출하면 가져온 파일을 자체적으로 소비하고 모든 전 처리기 코드를 주석 처리하는 임시 복사본을 생성합니다 (전처리 기가 무한 루프에서 자신을 재귀 적으로 호출하는 것을 방지하기 위해). 사용하지 않는 부분은 모두 주석 처리합니다.
모듈이 예외를 던지거나 충돌하는 경우 오류 추적에서 줄 번호를 유지하려면 줄을 제거하는 대신 줄을 주석 처리해야합니다. 그리고 오류 추적을 다시 작성하여 오류가 발생한 모듈의 적절한 파일 이름을 반영하도록보고했습니다.
그러면 후 처리 된 코드가 포함 된 생성 된 파일이 즉시 실행됩니다.
코드에 if 문을 인라인으로 추가하는 것보다이 방법을 사용하는 것의 장점은 코드의 주석 처리 된 부분이 컴파일 된 .pyc 파일에서 제외되기 때문에 쓸모없는 문을 평가하는 데 낭비되는 실행 시간이 없습니다.
단점 (그리고 모듈을 만든 원래 이유)은 파이썬 인터프리터가 코드를 실행하기 전에 전체 구문 검사를 실행하고 코드를 실행하기 전에 버전 별 코드를 거부하기 때문에 동일한 파일에서 파이썬 2x와 파이썬 3x를 모두 실행할 수 없다는 것입니다. 전처리 기는 :: sigh ::를 실행할 수 있습니다. 내 원래 목표는 실행중인 항목에 따라 버전 별 바이트 코드를 생성하는 동일한 파일에서 2x 및 3x 코드를 나란히 개발할 수있는 것이 었습니다.
어느 쪽이든, 전 처리기 모듈은 일반적인 c 스타일 전처리 기능을 구현하는 데 여전히 매우 유용합니다. 또한 전처리 기는 나중에 원할 경우 사용할 수 있도록 후 처리 된 코드를 파일로 출력 할 수 있습니다.
또한 모든 전 처리기 지시문과 제외 된 #ifdef가 제거 된 버전을 생성하려면 parse ()를 호출하기 전에 전 처리기 코드에서 플래그를 설정하는 것만 큼 간단합니다. 이렇게하면 버전 별 소스 파일에서 원치 않는 코드를 한 단계 프로세스로 제거 할 수 있습니다 (코드를 크롤링하고 수동으로 if 문을 제거하는 것과 비교).
이 대답을 싫어하실 것 같은데요. 파이썬에서 그렇게하는 방법은
# code here
if DEBUG:
#debugging code goes here
else:
# other code here.
파이썬은 인터프리터이기 때문에 적용 할 전처리 단계가 없으며 특별한 구문을 갖는 것의 특별한 이점도 없습니다.
Python에서 전처리기를 사용할 수 있습니다. bin 디렉토리의 cpp (C-Preprocessor)를 통해 스크립트를 실행하기 만하면됩니다. 그러나 나는 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 DEBUG = True -D M4_OS = android -D M4_CPU = arm test.py.m4> test.py
'programing tip' 카테고리의 다른 글
스트림을 s3.upload ()로 파이프 (0) | 2020.12.10 |
---|---|
SQL Server에서 커서를 사용하는 것이 나쁜 습관으로 간주되는 이유는 무엇입니까? (0) | 2020.12.10 |
WPF Datagrid에서 스크롤바를 활성화하려면 어떻게해야합니까? (0) | 2020.12.10 |
Oracle에서 SQL을 사용하여 올해를 어떻게 구합니까? (0) | 2020.12.10 |
테이블 내부의 행에 ng-repeat 및 ng-class 사용 (0) | 2020.12.09 |