¿Cómo obtener un nombre de función como una cadena en Python?

En Python, ¿cómo obtengo un nombre de función como una cadena, sin llamar a la función?

def my_function(): pass print get_function_name_as_string(my_function) # my_function is not in quotes 

debe salir "my_function" .

¿Está disponible tal función en Python? Si no, ¿alguna idea sobre cómo implementar get_function_name_as_string , en Python?

 my_function.__name__ 

Usar __name__ es el método preferido ya que se aplica de manera uniforme. A diferencia de func_name , también funciona en funciones incorporadas:

 >>> import time >>> time.time.func_name Traceback (most recent call last): File "", line 1, in ? AttributeError: 'builtin_function_or_method' object has no attribute 'func_name' >>> time.time.__name__ 'time' 

También los guiones bajos indican al lector que este es un atributo especial. Como beneficio adicional, las clases y los módulos también tienen un atributo __name__ , por lo que solo tiene que recordar un nombre especial.

También podrías usar

 import sys this_function_name = sys._getframe().f_code.co_name 
 my_function.func_name 

También hay otras propiedades divertidas de las funciones. Escriba dir(func_name) para dir(func_name) . func_name.func_code.co_code es la función comstackda, almacenada como una cadena.

 import dis dis.dis(my_function) 

mostrará el código en un formato legible casi por humanos. 🙂

Esta función devolverá el nombre de la función del llamante.

 def func_name(): import traceback return traceback.extract_stack(None, 2)[0][2] 

Es como la respuesta de Albert Vonpupp con un envoltorio amigable.

Si también te interesan los métodos de clase, Python 3.3+ tiene __qualname__ además de __name__ .

 def my_function(): pass class MyClass(object): def method(self): pass print(my_function.__name__) # gives "my_function" print(MyClass.method.__name__) # gives "method" print(my_function.__qualname__) # gives "my_function" print(MyClass.method.__qualname__) # gives "MyClass.method" 

Me gusta usar un decorador de funciones. Agregué una clase, que también mide el tiempo de la función. Supongamos que gLog es un registrador de Python estándar:

 class EnterExitLog(): def __init__(self, funcName): self.funcName = funcName def __enter__(self): gLog.debug('Started: %s' % self.funcName) self.init_time = datetime.datetime.now() return self def __exit__(self, type, value, tb): gLog.debug('Finished: %s in: %s seconds' % (self.funcName, datetime.datetime.now() - self.init_time)) def func_timer_decorator(func): def func_wrapper(*args, **kwargs): with EnterExitLog(func.__name__): return func(*args, **kwargs) return func_wrapper 

Así que ahora todo lo que tienes que hacer con tu función es decorarlo y listo.

 @func_timer_decorator def my_func(): 

No se garantiza que sys._getframe () esté disponible en todas las implementaciones de Python ( ver ref ), puede usar el módulo de rastreo para hacer lo mismo, por ejemplo.

 import traceback def who_am_i(): stack = traceback.extract_stack() filename, codeline, funcName, text = stack[-2] return funcName 

Una llamada a la stack [-1] devolverá los detalles del proceso actual.

Como una extensión de la respuesta de @Demyn , creé algunas funciones de utilidad que imprimen el nombre de la función actual y los argumentos de la función actual:

 import inspect import logging import traceback def get_function_name(): return traceback.extract_stack(None, 2)[0][2] def get_function_parameters_and_values(): frame = inspect.currentframe().f_back args, _, _, values = inspect.getargvalues(frame) return ([(i, values[i]) for i in args]) def my_func(a, b, c=None): logging.info('Running ' + get_function_name() + '(' + str(get_function_parameters_and_values()) +')') pass logger = logging.getLogger() handler = logging.StreamHandler() formatter = logging.Formatter( '%(asctime)s [%(levelname)s] -> %(message)s') handler.setFormatter(formatter) logger.addHandler(handler) logger.setLevel(logging.INFO) my_func(1, 3) # 2016-03-25 17:16:06,927 [INFO] -> Running my_func([('a', 1), ('b', 3), ('c', None)]) 

Solo desea obtener el nombre de la función aquí es un código simple para eso. Digamos que tienes estas funciones definidas

 def function1(): print "function1" def function2(): print "function2" def function3(): print "function3" print function1.__name__ 

la salida será function1

Ahora digamos que tiene estas funciones en una lista

 a = [function1 , function2 , funciton3] 

para obtener el nombre de las funciones

 for i in a: print i.__name__ 

la salida será

función1
función2
función 3

 import inspect def foo(): print(inspect.stack()[0][3])