Grazie a Jon Clements risposta sono stato in grado di fare una funzione che restituisce un elenco ordinato di tutti i chiamanti:
def f1():
names = []
frame = inspect.currentframe()
## Keep moving to next outer frame
while True:
try:
frame = frame.f_back
name = frame.f_code.co_name
names.append(name)
except:
break
return names
e quando viene chiamato in una catena:
def f2():
return f1()
def f3():
return f2()
def f4():
return f3()
print f4()
assomiglia a questo:
['f2', 'f3', 'f4', '<module>']
Nel mio caso ho filtrare nulla '<module>'
e dopo, e poi prendere l'ultimo elemento ad essere il nome del chiamante originario.
o modificare il loop originale per salvare alla prima comparsa di qualsiasi nome che inizia con '<'
:
frame = frame.f_back
name = frame.f_code.co_name
if name[0] == '<':
break
names.append(name)
fonte
2014-01-29 20:36:46
Dalla documentazione: 'Non è garantito ad esistere in tutte le implementazioni di Python.' – pradyunsg