19

Python で条件付きコンパイルを行うには?

DEF を使用していますか?

4

6 に答える 6

23

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 に設定することです。

  1. Python コードは、Java のような中間形式にバイト コンパイルされますが、通常、個別のコンパイル手順はありません。.py で終わる「生の」ソース ファイルは実行可能です。
于 2009-02-18T06:30:22.567 に答える
21

実際に条件付きコンパイルを取得する方法はありますが、非常に限られています。

if __debug__:
    doSomething()

__debug__フラグは特殊なケースです。-Oまたは-OOオプションを指定して python を呼び出すと、__debug__false になり、コンパイラはそのステートメントを無視します。これは主にアサートで使用されます。これが、スクリプトを最適化して「実際にコンパイル」するとアサーションがなくなる理由です。

したがって、目的がデバッグ コードを追加することであるが、速度が低下したり、「リリース」ビルドに影響を与えたりしないようにすることである場合、これで目的が達成されます。ただし、 に値を代入することはできないため、__debug__使用できるのはこれだけです。

于 2009-02-18T14:47:12.043 に答える
17

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:、これは真のプリプロセッサです。生成されるバイトコードには、条件付きで除外されるコードは含まれません。

于 2011-03-16T02:53:03.407 に答える
4

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

概念的に単純なままでありながら、動的言語を非常に強力なものにしているのは、このようなものです。

于 2009-02-18T22:43:46.173 に答える
3

動的な環境ではあまり意味がありません。関数の条件付き定義を探している場合は、次を使用できますif

if happy:
    def makemehappy():
        return "I'm good"
于 2009-02-18T06:31:23.967 に答える
0

ここで説明した方法を使用できます:変数が Pythonで代用として定義されているかどうかを確認します。#ifdef

于 2011-06-21T04:16:17.080 に答える