2010-03-27 9 views
8

C'è un modo per trovare quale funzione si chiama la funzione corrente? Quindi per esempio:Funzione genitore

def first(): 
    second() 

def second(): 
    # print out here what function called this one 

Qualche idea?

+4

@MikeG .: Volendo queste informazioni in un rilascio di produzione è male, sì. Usarlo per eseguire il debug e capire che una grande parte di Python va bene, IMHO. –

risposta

7
import inspect 

def first(): 
    return second() 

def second(): 
    return inspect.getouterframes(inspect.currentframe())[1] 

first()[3] # 'first' 
2

È possibile utilizzare la funzione extract_stack del modulo traceback.

import traceback 
def first(): 
    second() 

def second(): 
    print traceback.extract_stack(limit=2)[-2][2] 
2

Il modulo permette inspect per molte forme di introspezione compreso questo, ma notare che è consigliato solo ad utilizzare tali informazioni per scopi quali il debug, non come parte di funzionalità del codice di produzione. Vedi the docs per tutti i dettagli.

1

Queste funzionano bene per aggiungere rapidamente aiuti dove-sono-io debug minimo quando non si desidera importare un altro modulo. (Solo CPython, per il debug solo.)

def LINE(back = 0): 
    return sys._getframe(back + 1).f_lineno 
def FILE(back = 0): 
    return sys._getframe(back + 1).f_code.co_filename 
def FUNC(back = 0): 
    return sys._getframe(back + 1).f_code.co_name 
def WHERE(back = 0): 
    frame = sys._getframe(back + 1) 
    return "%s/%s %s()" % (os.path.basename(frame.f_code.co_filename), 
          frame.f_lineno, frame.f_code.co_name) 

Esempio:

import sys, os # these you almost always have... 

def WHERE(back = 0): 
    frame = sys._getframe(back + 1) 
    return "%s/%s %s()" % (os.path.basename(frame.f_code.co_filename), 
         frame.f_lineno, frame.f_code.co_name) 

def first(): 
    second() 

def second(): 
    print WHERE() 
    print WHERE(1) 

first() 

uscita:

$ python fs.py 
fs.py/12 second() 
fs.py/9 first() 
Problemi correlati