2012-01-06 19 views
5

Quiero crear algún tipo de salida de depuración para python y quiero pasar el nombre de la función a otra función para la salida.Equivalente a __func__ (de C) en Python

La única manera razonable que encontré en hacerlo fue:

def foobar(): 
    print 'hello world' 

    print foobar.__name__ 

¿hay algo que hace lo mismo que para la función actual para mejorar copiar y pegar de esa línea?

como el C equivalente printf("%s", __func__).

Respuesta

7

sys._getframe puede hacer eso:

import sys 

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

Una cosa que podría intentar es crear un decorador que hace esto:

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__' está realmente en C99, y hace exactamente lo que usted esperaba. – cha0site

+0

Es una gran noticia, me había perdido completamente eso. Gracias por informarme Respuesta actualizada :) – Krumelur

+0

Lo que ha hecho es un 'decorador', no una' anotación'. –

6

Bueno, sí, hay una manera ...

print sys._getframe().f_code.co_name 

Incluso puede hacer que sea una función (obteniendo el nombre del cuadro anterior):

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

ejemplo tonto sólo para mostrar que funciona:

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

(Tenga en cuenta que el decorador se muestra en la respuesta de Krumelur es una mejor solución al problema, pero es posible hacer lo que quiere en Python =)

+0

Lo uso para crear nombres de archivo como salida de registro así que las huellas no ayudan mucho aquí, pero gracias de todas formas. – Alex