15

カスタムデコレータでいくつかの主要な機能を装飾するモジュールがあります。

pdb を使用してこれらの関数をデバッグするのは少し面倒です。なぜなら、装飾された関数に入るたびに、最初にデコレータ コード自体をステップ実行する必要があるからです。

もちろん、関心のある関数内でブレークするようにデバッガーを設定することもできますが、重要な関数として、それらは多くの場所から何度も呼び出されるため、通常は関数の外でデバッグを開始することを好みます。

コードで説明しようとしましたが、それが役立つかどうかはわかりません:

def i_dont_care_about_this(fn):
    @functiontools.wraps(fn)
    def wrapper(*args, **kwargs):
        return fn(*args, **kwargs)
    return wrapper

@i_dont_care_about_this
def i_only_care_about_this():
    # no use to set pdb here

def i_am_here():
    import pdb; pdb.set_trace()
    i_only_care_about_this()

それで、私が通過せずにi_only_care_about_thisから入る方法はありますか?i_am_herei_dont_care_about_this

基本的に、特定の装飾された関数にs to ( s )tep を使用する場合、すべてのデコレータ コードをスキップしたいと考えています。

4

5 に答える 5

8

デコレータが純粋にログ記録やその他の非機能的な動作のためのものである場合は、デバッグの操作を行わないようにします。次のコードを の定義の直後に挿入しますi_dont_care_about_this

DEBUG = False
# uncomment this line when pdb'ing
# DEBUG = True
if DEBUG:
    i_dont_care_about_this = lambda fn : fn

ただし、実際にアクティブなコードが含まれている場合は、デコレータ内のコード内で pdb.set_trace への条件付き呼び出しなど、pdb メソッドを使用して作業を行う必要があります。

BREAK_FLAG = False
...
# (inside your function you want to debug)
if BREAK_FLAG:
    import pdb; pdb.set_trace()
...
# at your critical calling point
BREAK_FLAG = True
于 2012-05-02T13:02:49.200 に答える
4

私はあなたがそれを行うことができるとは思わない. それはステップの意味を非常に異なるものに変えるでしょう。

ただし、必要なものに似たものを実現する方法があります。装飾された関数と、装飾された関数が呼び出される直前にブレークポイントを設定します。ここで、関数内のブレークポイントを無効にします。

これで、コードを実行すると、関心のある特定の呼び出しに到達したときにのみ壊れます。そのブレークが発生したら、関数のブレークポイントを再度有効にして、実行を続行します。これにより、装飾されたすべてのコードが実行され、装飾された関数の最初の行で中断されます。

于 2012-05-02T11:58:53.517 に答える