最近、Pythonで多くのコーディングを行っています。また、これまでに使用したことがないデータを使用したり、これまでにない式を使用したり、巨大なファイルを処理したりしています。これにより、多くの印刷ステートメントを記述して、問題がないかどうかを確認し、失敗した箇所を特定しました。しかし、一般的に、それほど多くの情報を出力することは良い習慣ではありません。デバッグしたい場合にのみ印刷ステートメントを使用し、印刷しない場合はスキップする方法を教えてください。
最近、Pythonで多くのコーディングを行っています。また、これまでに使用したことがないデータを使用したり、これまでにない式を使用したり、巨大なファイルを処理したりしています。これにより、多くの印刷ステートメントを記述して、問題がないかどうかを確認し、失敗した箇所を特定しました。しかし、一般的に、それほど多くの情報を出力することは良い習慣ではありません。デバッグしたい場合にのみ印刷ステートメントを使用し、印刷しない場合はスキップする方法を教えてください。
回答:
このloggingモジュールには、必要なものがすべて揃っています。最初は過剰に見えるかもしれませんが、必要な部品のみを使用してください。を使用logging.basicConfigしてログレベルを切り替えることをお勧めしますstderrと、単純なログ方法、debug、info、warning、errorとcritical。
import logging, sys
logging.basicConfig(stream=sys.stderr, level=logging.DEBUG)
logging.debug('A debug message!')
logging.info('We processed %d records', len(processed_records))
levelは、basicConfig呼び出しでに設定しlogging.ERRORます。
logging.basicConfig(stream=sys.stderr, level=logging.ERROR)ても効果はありません。カーネルを再起動して新しいレベルを設定することは機能しますが、それは私にとっての回避策です。
これを行う簡単な方法は、ロギング関数を呼び出すことです。
DEBUG = True
def log(s):
if DEBUG:
print s
log("hello world")
次に、の値を変更して、DEBUGログの有無にかかわらずコードを実行できます。
標準loggingモジュールには、このためのより複雑なメカニズムがあります。
logging(非常に単純なレベルで)どのように機能するかについての良い考えです。
まず、Pythonのロギングフレームワークの推薦を2番目に紹介します。ただし、使用方法には少し注意してください。具体的には、ロギングフレームワークに変数を展開させます。自分では行わないでください。たとえば、代わりに:
logging.debug("datastructure: %r" % complex_dict_structure)
あなたがすることを確認してください:
logging.debug("datastructure: %r", complex_dict_structure)
最初のバージョンは似ているように見えますが、無効になっている場合でも repr()のコストが発生するためです。2番目のバージョンはこれを回避します。同様に、自分でロールする場合は、次のようにすることをお勧めします。
def debug_stdout(sfunc):
print(sfunc())
debug = debug_stdout
次を介して呼び出されます:
debug(lambda: "datastructure: %r" % complex_dict_structure)
これも、次のようにして無効にした場合のオーバーヘッドを回避します。
def debug_noop(*args, **kwargs):
pass
debug = debug_noop
これらの文字列を計算するオーバーヘッドは、1)計算にコストがかかるか、2)デバッグステートメントが、たとえばn ^ 3ループなどの途中にない限り、おそらく問題ではありません。それについて私が何かを知っているとは限りません。
他の人については知りませんが、「グローバル定数」(DEBUG)を定義してから、の場合にのみ出力されるグローバル関数(debug(msg))を定義するのに慣れていました。msgDEBUG == True
次に、次のようなデバッグステートメントを記述します。
debug('My value: %d' % value)
...それから私は単体テストを取り上げ、これを二度とやったことはありません!:)
print()していますが、テストに合格するために必要なレベルまでコードを引き上げるのはほんの数回です。あちこちで膨大な量になることはありませんprint()。ロギングもクールです!:)