2012-05-02 5 views
6

私はカスタムデコレータでいくつかの主要な機能を装飾するモジュールを持っています。デコレータコードをスキップして装飾された関数にステップインする方法はありますか?

これらの関数を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_dont_care_about_thisを経由せずi_am_hereからi_only_care_about_thisにステップするための方法がありますか?

基本的に私は与えられた装飾された関数に()TEPにを使用した場合、すべてのデコレータコードをスキップしたいです。

+2

とで元の関数がentereであることを示すd?このようなことを可能にするためには、デコレータとPDBの両方を適応させる必要があります。 –

+0

私は、内部的にPythonがデコレータをどのように扱うかについて私が知っている方法があると考えました。 –

答えて

4

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

しかし、あなたが欲しいものに似た何かを達成する方法があります。装飾された関数と装飾された関数が呼び出される直前のブレークポイントを設定します。今、関数内のブレークポイントを無効にします。

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

+0

ええと、私はOPはすでにそれを知っていると思う、少なくとも彼は彼/彼女がすでに考えている可能性として質問でそれを記述する。 –

+0

私は実際には持っていないし、場合によっては助けになるかもしれない –

6

デコレータがロギングまたは他の非機能的動作のために純粋であるならば、それデバッグのためノーオペレーションを作る - 右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 
PDBは、関数が飾られていることを知ることになってどのように
関連する問題