1. ホーム
  2. python

[解決済み] Pythonで "#ifdef "を実装するには?

2022-02-10 11:55:01

質問

でのプログラミング C 以前は、デバッグ目的(ロギングコマンドなど)だけに使うコードセクションがありました。これらのステートメントは、実稼働時には #ifdef のようなプリプロセッサーディレクティブがあります。

 #ifdef MACRO

 controlled text

 #endif /* MACRO */

で同様のことをする場合、どのような方法があるのでしょうか? python ?

解決方法は?

ロギングメソッドを無効にしたいだけなら logging モジュールを使用します。ログレベルが、例えばデバッグ文などを除外するように設定されている場合は logging.debug は、ほとんど何もしません (ログレベルをチェックし、ログ文字列を補間せずに戻ります)。

バイトコードコンパイル時に、特定の変数を条件としてコードの塊を実際に削除したい場合、唯一の選択肢は、かなり謎めいた __debug__ グローバル変数です。この変数に True がない限り -O フラグがPythonに渡される(または PYTHONOPTIMIZE が空でないものに設定されている環境であること。)

もし __debug__ の中で使用されている if ステートメントを使用する場合、その if ステートメントは、実際には True という分岐があります。この特別な最適化は、Pythonが持つプリプロセッサマクロに近いものです。

マクロと違って、コードは if .


を示すために __debug__ が動作する、次の2つの関数を考えてみましょう。

def f():
    if __debug__: return 3
    else: return 4

def g():
    if True: return 3
    else: return 4

でチェックしてみてください。 dis :

>>> dis.dis(f)
  2           0 LOAD_CONST               1 (3)
              3 RETURN_VALUE        
>>> dis.dis(g)
  2           0 LOAD_GLOBAL              0 (True)
              3 JUMP_IF_FALSE            5 (to 11)
              6 POP_TOP             
              7 LOAD_CONST               1 (3)
             10 RETURN_VALUE        
        >>   11 POP_TOP             

  3          12 LOAD_CONST               2 (4)
             15 RETURN_VALUE        
             16 LOAD_CONST               0 (None)
             19 RETURN_VALUE        

ご覧のように f は最適化されています。