2012-05-02 8 views
6

Ho un modulo che decora alcune funzioni chiave con decoratori personalizzati.C'è un modo per entrare in funzioni decorate, saltando codice decoratore

Il debug di queste funzioni con pdb spesso è un po 'un problema, perché ogni volta che passo in una funzione decorata, devo prima passare attraverso il codice decoratore stesso.

Naturalmente potrei semplicemente impostare il debugger in modo che si interrompa all'interno della funzione a cui sono interessato, ma come funzioni chiave vengono chiamate più volte da più posti, quindi di solito preferisco iniziare il debug all'esterno della funzione.

ho cercato di illustrare con il codice, ma non so se questo aiuta:

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

Quindi, c'è un modo per me di entrare in i_only_care_about_this da i_am_here senza passare attraverso i_dont_care_about_this?

Essenzialmente voglio passare tutto il codice decoratore utilizzando s a (s ) TEP in una data funzione decorato.

+2

Come si suppone PPB sapere che una funzione è decorato e al quale punto è la funzione originale d? Dovresti adattare sia i tuoi decoratori che i PDB per rendere possibile qualcosa di simile. –

+0

Ho pensato che potrebbe esserci un modo in cui la mia conoscenza di come Python gestisce internamente i decoratori è piuttosto limitata. –

risposta

4

non credo che si può fare. Cambierà il significato del passo per essere qualcosa di molto diverso.

Tuttavia, esiste un modo per ottenere qualcosa di simile a ciò che si desidera. Imposta un punto di interruzione nella funzione decorata e uno appena prima che venga chiamata la funzione decorata. Ora, disabilita il punto di interruzione all'interno della funzione.

Ora, quando si esegue il codice, si interromperà solo quando si raggiunge l'invocazione specifica che interessa. Una volta che si verifica tale interruzione, riattivare il punto di interruzione nella funzione e continuare l'esecuzione. Questo eseguirà tutto il codice decorato e interromperà la prima riga della funzione decorata.

+0

Hm, penso che OP già conosca quella roba, almeno lo descrive nella domanda come una possibilità che lui/lei ha già considerato. –

+0

In realtà non l'ho fatto e potrebbe essere d'aiuto in alcuni casi –

6

Se il decoratore è puramente per la registrazione o altri comportamenti non funzionali, poi ne fanno un no-op per il debug - inserire questo codice subito dopo la definizione di 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 

Ma se contiene attuale codice attivo, allora si dovrà fare il lavoro utilizzando metodi PDB, come ad esempio una chiamata conditionalized per pdb.set_trace all'interno del codice all'interno del decoratore:

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 
Problemi correlati