Python で条件付きコンパイルを行うには?
DEF を使用していますか?
Python は、C や C++、さらには Java と同じ意味でコンパイルされるわけではありません。Python ファイルは「オンザフライ」でコンパイルされます。これは、Basic や Perl などのインタープリター言語に似ていると考えることができます。1
if ステートメントを使用するだけで、条件付きコンパイルと同等のことができます。例えば:
if FLAG:
def f():
print "Flag is set"
else:
def f():
print "Flag is not set"
作成クラス、変数の設定、およびほとんどすべてに対して同じことができます。
IFDEF を模倣する最も近い方法は、hasattr 関数を使用することです。例えば:
if hasattr(aModule, 'FLAG'):
# do stuff if FLAG is defined in the current module.
名前のエラーをキャッチするために try/except 句を使用することもできますが、慣用的な方法は、スクリプトの先頭で変数を None に設定することです。
実際に条件付きコンパイルを取得する方法はありますが、非常に限られています。
if __debug__:
doSomething()
__debug__
フラグは特殊なケースです。-O
または-OO
オプションを指定して python を呼び出すと、__debug__
false になり、コンパイラはそのステートメントを無視します。これは主にアサートで使用されます。これが、スクリプトを最適化して「実際にコンパイル」するとアサーションがなくなる理由です。
したがって、目的がデバッグ コードを追加することであるが、速度が低下したり、「リリース」ビルドに影響を与えたりしないようにすることである場合、これで目的が達成されます。ただし、 に値を代入することはできないため、__debug__
使用できるのはこれだけです。
pypreprocessorを使用する
これはPYPI (Python Package Index)にもあり、pip を使用して取得できます。
基本的な使用例は次のとおりです。
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.output = 'output_file_name.py'
pypreprocessor のインポートと parse() の呼び出しの間の任意の場所。
このモジュールは、基本的に C プリプロセッサの条件付きコンパイルの Python 実装です。
補足: これは python2x と python 3k の両方と互換性があります
免責事項: 私は pypreprocessor の作成者です
アップデート:
前に言い忘れました。if
他の回答で説明されている/else
またはアプローチとは異なりif _debug:
、これは真のプリプロセッサです。生成されるバイトコードには、条件付きで除外されるコードは含まれません。
Python は、モジュールをインポートすると自動的にコンパイルするため、コンパイルを回避する唯一の方法は、モジュールをインポートしないことです。次のように書くことができます:
if some_condition:
import some_module
しかし、それは完全なモジュールに対してのみ機能します。C および C++ では、通常、条件付きコンパイルにプリプロセッサを使用します。Python コードでプリプロセッサを使用することを妨げるものは何もないため、次のように記述できます。
#ifdef SOME_CONDITION
def some_function():
pass
#endif
それを C プリプロセッサで実行すると、実際の条件付きコンパイルが行われ、 が定義some_function
されている場合にのみ定義SOME_CONDITION
されます。
しかし(そしてこれは重要です):条件付きコンパイルはおそらくあなたが望むものではありません。モジュールをインポートすると、Python はモジュール内のコードを実行するだけです。モジュール内の def ステートメントと class ステートメントは、モジュールをインポートするときに実際に実行されます。したがって、他の言語が条件付きコンパイルを使用するものを実装する典型的な方法は、次のような通常の if ステートメントです。
if some_condition:
def some_function():
pass
これは true のsome_function
場合にのみ定義されます。some_condition
概念的に単純なままでありながら、動的言語を非常に強力なものにしているのは、このようなものです。
動的な環境ではあまり意味がありません。関数の条件付き定義を探している場合は、次を使用できますif
。
if happy:
def makemehappy():
return "I'm good"
ここで説明した方法を使用できます:変数が Pythonで代用として定義されているかどうかを確認します。#ifdef