74

Python で次のプリプロセッサ ディレクティブを実行する方法はありますか?

#if DEBUG

< do some code >

#else

< do some other code >

#endif
4

8 に答える 8

122

があります__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:ソースが解釈される前にすべての行を削除します。

于 2009-01-27T03:25:06.353 に答える
40

あなたが説明していることを正確に行う pypreprocessor という python プリプロセッサを作成しました。

ソースとドキュメントは 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 は、オンザフライの前処理だけではありません。ユースケースの例をもっと見るには、Google Code のプロジェクトをチェックしてください。

更新: pypreprocessor の詳細

前処理を行う方法は簡単です。上記の例から、プリプロセッサは pypreprocessor モジュールで作成された pypreprocessor オブジェクトをインポートします。プリプロセッサで parse() を呼び出すと、インポート先のファイルを自己消費し、すべてのプリプロセッサ コードをコメント アウトした自身の一時コピーを生成します (プリプロセッサが無限ループで再帰的に自身を呼び出すのを回避するため)。未使用部分をすべてコメントアウトします。

行を削除するのではなく、行をコメント アウトすることは、モジュールが例外をスローしたりクラッシュした場合にエラー トレースバックの行番号を保持するために必要です。そして、エラーのトレースバックを書き直して、クラッシュしたモジュールの適切なファイル名を反映するように報告することさえしました。

次に、後処理されたコードを含む生成されたファイルがオンザフライで実行されます。

コードに一連の if ステートメントをインラインで追加するだけでなく、この方法を使用することの利点は、コードのコメントアウトされた部分がコンパイルされた .pyc ファイルから除外されるため、無駄なステートメントの評価に無駄な実行時間がないことです。

欠点 (およびモジュールを作成する最初の理由) は、同じファイルで python 2x と python 3x の両方を実行できないことです。これは、pythons インタープリターがコードを実行する前に完全な構文チェックを実行し、実行前のバージョン固有のコードを拒否するためです。プリプロセッサは ::sigh:: を実行できます。私の当初の目標は、2x と 3x のコードを同じファイルに並べて開発し、それが実行されているものに応じてバージョン固有のバイトコードを作成できるようにすることでした。

いずれにせよ、プリプロセッサ モジュールは、一般的な C スタイルの前処理機能を実装するのに非常に役立ちます。同様に、プリプロセッサは、必要に応じて後で使用するために、後処理されたコードをファイルに出力できます。

また、すべてのプリプロセッサ ディレクティブと、除外された #ifdef のいずれかが削除されたバージョンを生成する場合は、parse() を呼び出す前にプリプロセッサ コードでフラグを設定するだけです。これにより、バージョン固有のソース ファイルから不要なコードを削除するプロセスが 1 ステップになります (コードをクロールして if ステートメントを手動で削除するのとは対照的です)。

于 2010-06-07T06:46:27.720 に答える
26

あなたはこの答えを嫌うと思います。Pythonでそれを行う方法は次のとおりです

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

Python はインタープリターであるため、適用する前処理手順はなく、特別な構文を使用することによる特別な利点もありません。

于 2009-01-27T01:14:24.790 に答える
11

Python でプリプロセッサを使用できます。bin ディレクトリの cpp (C プリプロセッサ) を介してスクリプトを実行するだけです。しかし、私は Lua でこれを行いました。簡単な解釈の利点は、より複雑なコンパイルの IMHO を上回っています。

于 2009-01-27T01:16:14.070 に答える
5

通常の言語構造を使用できます。

DEBUG = True
if DEBUG:
  # Define a function, a class or do some crazy stuff
  def f():
    return 23
else:
  def f():
    return 42
于 2009-01-27T01:14:28.690 に答える
2

別の方法は、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
于 2015-07-07T06:47:17.927 に答える