2012-05-02 28 views
6

Bazı dümen işlevlerini özel dekoratörlerle süsleyen bir modülüm var.Süslü işlevlere adım atmanın bir yolu var, dekoratör kodunu atlıyor

Bu işlevlerin pdb ile hata ayıklaması sıklıkla bir acı vericidir, çünkü her zaman dekore edilmiş bir işleve adım attığımda, ilk önce dekoratör kodunun kendisinden geçmek zorundayım.

Tabii ki hata ayıklayıcısını, ilgilendiğim işlevin içinde kırmak için ayarlayabilirim, ancak önemli işlevler olarak birçok yerden birçok kez çağrılırlar, bu nedenle genellikle işlevin dışında hata ayıklamayı başlatmayı tercih ederim.

Ben koduyla göstermek için çalıştı, ama o yardımcı olur bilmiyorum: Yani

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() 

beni i_dont_care_about_this geçmeden i_am_here den i_only_care_about_this hayata adım atmak bir yol var? Verilen bir şekilde dekore fonksiyonun içine (s) dım için s kullanırken

Esasen bütün dekoratör kodunu atlamak istiyor.

+2

ve en hangi orijinal işlevin işaret ettiği entere D? Dekoratörlerinizi ve PDB'nizi bu gibi bir şey yapmak için uyarlamanız gerekir. –

+0

Python'un dekoratörleri içsel olarak nasıl ele geçirdiğini bildiğim kadarıyla bir yol olabileceğini düşündüm. –

cevap

4

Bunu yapabileceğinizi sanmıyorum. Çok farklı bir şey olması için adımın anlamını değiştirir. Bununla birlikte, istediğiniz şeye benzer bir şey elde etmenin bir yolu vardır. Dekore edilmiş fonksiyonunuzda ve dekore edilmiş fonksiyonun hemen öncesinde bir kesme noktası ayarlayın. Şimdi, fonksiyonun içindeki kesme noktasını devre dışı bırakın.

Şimdi, kodu çalıştırdığınızda, yalnızca önem verdiğiniz belirli çağrılara ulaştığınızda bozulur. Bu kesinti olduğunda, işlevdeki kesme noktasını yeniden etkinleştirin ve yürütmeye devam edin. Bu, tüm dekore edilmiş kodları yürütecek ve dekore edilmiş işlevin ilk satırını kıracaktır.

+0

Hm, OP'nin bu şeyleri zaten bildiğini, en azından halihazırda daha önce üzerinde düşünmüş olduğu bir olasılık olarak sorduğunu düşünüyorum. –

+0

Aslında yok ve bazı durumlarda yardımcı olabilir –

6

dekoratör günlük veya diğer işlevsel olmayan davranış için tamamen ise, o zaman bir hata ayıklama için hiçbir-op yapmak - sağ i_dont_care_about_this tanımına sonra bu kodu ekleyin:

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

Ama gerçek içeriyorsa aktif kod, o zaman dekoratör içindeki kod içine pdb.set_trace için böyle bir koşullandırılmıştır çağrısı olarak pdb yöntemler kullanarak iş yapmak zorunda kalacaktır:

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 bir işlev dekore olduğunu bilmek gerekiyordu nasıl
İlgili konular