2011-12-01 12 views
5

Voglio ottenere il numero di riga di una funzione python nel codice sorgente. Quello che ho in fase di esecuzione è il modulo, classe, metodo oggettiCome ottenere il numero di linea della funzione (con/senza un decoratore) in un modulo python?

hanno guardato ispezionare

inspect.getsourcelines(object)  

che dà anche il numero di riga del risultato.

Vedo che per i metodi con decoratori, linea n. restituito da sopra ispezionare i punti funzione sul codice sorgente effettivo del decoratore piuttosto che sul codice sorgente della funzione desiderata. Quindi un modo per aggirare questo? (ho capito che l'interprete fa qualcosa come la funzione di wrapping all'interno del decoratore in runtime, ma potrei sbagliarmi)

risposta

4

Non c'è una soluzione facile nel caso generale.

Un decoratore è una funzione che a una funzione restituisce una funzione, normalmente "avvolgendola" in una chiusura che esegue l'operazione per cui è stato progettato il decoratore.

Le informazioni sul numero di file e sulla riga non si trovano tuttavia nell'oggetto funzione stesso e non è possibile "risolverle" copiando queste informazioni dalla funzione spostata al wrapper. Tali dati sono invece contenuti nell'oggetto code della funzione (disponibile con .func_code) e sono condivisi tra tutte le chiusure che si stanno creando.

>>> def bar(x): 
...  def foo(): 
...   return x 
...  return foo 
... 
>>> f1 = bar(1) 
>>> f2 = bar(2) 
>>> f1() 
1 
>>> f2() 
2 
>>> f1.func_code is f2.func_code 
True 
>>> 
+0

Vedo, grazie per l'expln. Anche con 'func_code' sto prendendo la linea n. del codice sorgente del decoratore. Procedere ignorando la linea di impostazione n. per i metodi con qualsiasi decoratore. La mia domanda ora è come scoprire che un metodo ha _any_ decorator o no (nome decoratore non conosciuto in precedenza) – Hari

+0

@Hari: un decoratore può restituire ciò che vuole (anche qualcosa che non è una chiusura o anche solo la stessa funzione che esso preso in input, possibilmente facendo qualche altro calcolo prima di restituirlo) quindi non esiste un metodo sicuro al 100% per sapere se una funzione è stata decorata o non ha dato l'oggetto funzione. – 6502

1

Il modulo wrapt risolve questo problema permettendo di scrivere decoratori che conservano i metadati necessari per individuare la fonte di una funzione e di eseguire altre introspezione. È come un miglioramento functools.wraps.

Problemi correlati