C
私のプログラミングでは、以前はデバッグ目的(ロギングコマンドなど)にのみ使用されるコードセクションがありました。これらのステートメントは#ifdef
、次のようにプリプロセッサディレクティブを使用することで、本番環境で完全に無効にすることができます。
#ifdef MACRO
controlled text
#endif /* MACRO */
同様のことをする最良の方法は何python
ですか?
ロギングメソッドを無効にするだけの場合は、logging
モジュールを使用します。ログレベルが、たとえばデバッグステートメントを除外するように設定されている場合、logging.debug
no-opに非常に近くなります(ログレベルをチェックして、ログ文字列を補間せずに戻るだけです)。
特定の変数を条件としてバイトコードのコンパイル時にコードのチャンクを実際に削除したい場合、唯一の選択肢はかなり不可解__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
「最適化」のみされています。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加