0

Cコードでは、次のようなprintfデバッグマクロを頻繁に使用します

#define DPRINT_INT(i) fprintf(stderr,"%s has the value %i at line %i", #i,i, __LINE__)

そして、変数を出力する DPRINT_INT(height) のようなこと、または DPRINT_INT(from_cm_to_inch(get_average(heights))) のようなことを行うことができ、名前の式全体を出力します。

Python には C のようなマクロがないため、Python でこれを行うには

文字列を渡し、inspect を使用して呼び出し元の関数環境を取得し、eval を呼び出します。しかし、私は文字列を渡すのが好きではありません.醜くて忘れやすいです(型をチェックし、文字列以外が渡された場合は例外を呼び出します)、ideではうまく機能しません.

デバッグ機能の Python コードから変数名と式を抽出する方法はありませんか? ある?

4

1 に答える 1

2

Python では、単体テストおよび/または REPL にインポートできるモジュールを作成し、必要に応じてそこで駆動する傾向があります。

関数の単体テストができれば、任意の入力に対する関数の動作を証明できます。ただし、デバッグ ステートメントを記述する必要がある場合debug()は、標準loggingモジュールから使用する必要があります。

例えば:

#!/usr/bin/env python

import logging
import inspect

def buggy_fn():
    d = 42;
    if d != 69:
        logging.debug('%s(%d): %s is not what we expected. [%s]',
                inspect.currentframe().f_back.f_code.co_filename,
                inspect.currentframe().f_back.f_lineno,
                'd',
                repr(d),
                )

if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    buggy_fn()

出力します...

DEBUG:root:./buggy.py(19): d is not what we expected. [42]

必要なときに役立つ便利なアイテムが豊富にinspectあります。

于 2011-12-20T09:55:47.183 に答える