2012-01-06 19 views
5

Voglio creare una sorta di output di debug per python e voglio passare il functionname a un'altra funzione per l'output.Equivalente di __func__ (da C) in Python

L'unico modo ragionevole che ho trovato per farlo era:

def foobar(): 
    print 'hello world' 

    print foobar.__name__ 

c'è qualcosa che fa la stessa cosa per la funzione corrente per migliorare la copia e incolla di quella linea?

come l'equivalente C printf("%s", __func__).

risposta

7

sys._getframe può farlo:

import sys 

def foobar(): 
    print sys._getframe().f_code.co_name 
9

Una cosa che si potrebbe provare è quello di creare un decoratore che fa questo:

def traceme(func): 
    def newfunc(*args, **kwargs): 
    ret = func(*args, **kwargs) 
    print func.__name__ 
    return ret 
    return newfunc 

@traceme 
def foobar(): 
    print 'hello world' 
+1

'__func__' è in realtà in C99, e fa esattamente quello che ti aspettavi. – cha0site

+0

Questa è una grande notizia, l'avevo completamente perso. Grazie per l'informazione. Risposta aggiornata :) – Krumelur

+0

Quello che hai fatto è un 'decoratore', non un 'annotazione'. –

6

Beh, sì, c'è un modo ...

print sys._getframe().f_code.co_name 

Si può persino renderlo una funzione (ottenendo il nome del frame precedente):

def function_name(): 
    return sys._getframe().f_back.f_code.co_name 

esempio stupido solo per dimostrare che funziona:

>>> def bar(): 
...  return function_name() 
... 
>>> bar() 
'bar' 

(Si noti che il decoratore mostrato nella risposta di Krumelur è una soluzione molto migliore per il problema, ma è possibile fare ciò che si voglio in Python =)

+0

Io lo uso per creare nomi di file come output di log quindi le tracce non aiutano molto qui, ma grazie Comunque. – Alex