2011-09-15 11 views
6

Duplicar posible:
How to get the function name as string in Python?¿Cómo obtener el nombre de la función como cadena en Python?

Sé que puedo hacer eso:

def func_name(): 
    print func_name.__name__ 

que devolverá el nombre de la función como 'mi_func'.

Pero como estoy en la función, ¿hay alguna manera de llamarlo directamente de forma genérica? Algo así como:

def func_name(): 
    print self.__name__ 

En qué Python entendería que quiero que la parte superior de mi jerarquía de código?

+1

por cierto, 'self' no es una palabra clave en la magia Python, es solo una convención para nombrar el primer parámetro pasado a un método de instancia (que es la instancia a la que está vinculado el método). – geoffspear

+1

No creo que haya ninguna solución fácil. Verifique esta pregunta http://stackoverflow.com/questions/5063607/is-there-a-self-flag-can-reference-python-function-inside-itself – rplnt

+1

¿Para qué planea usar el nombre? –

Respuesta

5

AFAIK, no lo hay. Además, aunque el primer método no es totalmente fiable, ya que un objeto de función puede tener varios nombres:

In [8]: def f(): pass 
    ...: 

In [9]: g = f 

In [10]: f.__name__ 
Out[10]: 'f' 

In [11]: g.__name__ 
Out[11]: 'f' 
2

Un posible método sería utilizar Decorators:

def print_name(func, *args, **kwargs): 
    def f(*args, **kwargs): 
     print func.__name__ 
     return func(*args, **kwargs) 
    return f 

@print_name 
def funky(): 
    print "Hello" 

funky() 

# Prints: 
# 
# funky 
# Hello 

problema con esto es va solo podrá imprimir el nombre de la función antes o después de llamar a la función real.

Aunque es realista, ya que ya está definiendo la función, ¿no podría simplemente codificar el nombre?

5

También puede utilizar el módulo traceback:

import traceback 

def test(): 
    stack = traceback.extract_stack() 
    print stack[len(stack)-1][2] 


if __name__ == "__main__": 
    test() 
Cuestiones relacionadas