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

En Python, ¿cómo puedo obtener el nombre de la función como una cadena sin llamar a una función?

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

debe mostrar "my_function" .

¿Está disponible esta característica en Python? Si no, ¿alguna idea sobre cómo implementar get_function_name_as_string en Python?

523
30 окт. set e70 30 oct. 2008-10-30 22:38 '08 a las 10:38 pm 2008-10-30 22:38
@ 9 respuestas
 my_function.__name__ 

Usar __name__ es el método preferido porque se aplica de manera uniforme. A diferencia de func_name , también funciona con funciones integradas:

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

Además, los guiones bajos indican al lector que este es un atributo especial. Como beneficio adicional, las clases y los módulos tienen el atributo __name__ , por lo que solo recuerda un nombre especial.

668
01 нояб. respuesta dada por el usuario28409 01 nov. 2008-11-01 03:07 '08 a las 3:07 2008-11-01 03:07

También puedes usar

border=0
 import sys this_function_name = sys._getframe().f_code.co_name 
217
22 нояб. Responder Albert Vonpupp 22 nov. 2012-11-22 16:59 '12 a las 4:59 pm 2012-11-22 16:59
 my_function.func_name 

Hay otras características divertidas. Introduzca dir(func_name) para dir(func_name) . func_name.func_code.co_code es una función compilada que se almacena como una cadena.

 import dis dis.dis(my_function) 

Mostrará el código en un formato casi comprensible para el usuario. :)

37
30 окт. Respuesta dada por Markus Jarderot el 30 de octubre. 2008-10-30 22:39 '08 a las 10:39 pm 2008-10-30 22:39

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] 

Esto es similar a la respuesta de Albert Wonppuppa con un empaque amigable.

28
21 дек. La respuesta se da Demyn 21 dic. 2013-12-21 03:59 '13 a las 3:59 2013-12-21 03:59

Es posible que sys._getframe () no 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 

Llamar a la pila [-1] devolverá los detalles actuales del proceso.

11
31 авг. La respuesta es dada por Sandyc el 31 de agosto. 2013-08-31 03:34 '13 a las 3:34 am 2013-08-31 03:34

Si también está interesado en 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" 
10
07 нояб. respuesta dada lapis 07 nov. 2017-11-07 13:48 '17 a las 13:48 2017-11-07 13:48

Me gusta usar la función de decorador. Agregué una clase que también multiplica 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 embellecerlo y listo.

 @func_timer_decorator def my_func(): 
9
19 июля '16 в 11:37 2016-07-19 11:37 la respuesta la da radato el 19 de julio de 2016 a las 11:37 2016-07-19 11:37

Como la extensión de respuesta @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)]) 
8
26 марта '16 в 0:21 2016-03-26 00:21 la respuesta es dada por Jim G. 26 de marzo, '16 a las 0:21 2016-03-26 00:21

Solo desea obtener el nombre de la función aquí, este es un código simple para eso. digamos que definiste estas funciones

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

la salida funcionará1

Ahora digamos que tiene estas características enumeradas

 a = [function1 , function2 , funciton3] 

obtener el nombre de la función

 for i in a: print i.__name__ 

la salida será

función1
función2
función 3

2
16 марта '18 в 17:21 2018-03-16 17:21 Muhammad Mohsin dio respuesta el 16 de marzo de 18 a las 5:21 pm 2018-03-16 17:21

Otras preguntas sobre la etiquetas de o Haz una pregunta