En Python, ¿cómo obtengo el nombre de una 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
debería salir "my_function"
.
¿Esta función está disponible en Python? Si no, ¿alguna idea sobre cómo implementar get_function_name_as_string
, en Python?
Respuestas:
El uso
__name__
es el método preferido ya que se aplica de manera uniforme. A diferenciafunc_name
, también funciona en funciones integradas:También los guiones bajos dobles indican al lector que este es un atributo especial. Como beneficio adicional, las clases y los módulos también tienen un
__name__
atributo, por lo que solo debe recordar un nombre especial.fuente
def wrapper(kwargs): super(ExtendedClass,self).call('wrapper', kwargs)
. Usted tiene otra opción, que es:def wrapper(kwargs): super(ExtendedClass,self).call(sys._getframe().f_code.co_name, kwargs)
. Entonces, la respuesta de Albert Vonpupp me parece mejor.f.__name__ == 'f'
.Para obtener el nombre de la función o método actual desde adentro, considere:
sys._getframe
también funciona en lugar deinspect.currentframe
aunque este último evita acceder a una función privada.Para obtener el nombre de la función de llamada, considere
f_back
como eninspect.currentframe().f_back.f_code.co_name
.Si también lo usa
mypy
, puede quejarse de que:Para suprimir el error anterior, considere:
fuente
sys._getframe
: está directamente conectado a las partes internas de CPython.sys._getframe(1).f_code.co_name
, para que pueda definir una función comoget_func_name()
y esperar obtener el nombre deseado de la función que invocó.También hay otras propiedades divertidas de funciones. Escriba
dir(func_name)
para enumerarlos.func_name.func_code.co_code
es la función compilada, almacenada como una cadena.mostrará el código en un formato legible para humanos. :)
fuente
__names__
son privados,__names
son especiales._names
privado (subrayado simple antes, solo una convención),__names__
son especiales (subrayados dobles antes y después). No estoy seguro si el doble subrayado antes tiene algún significado, formalmente o como convención.func_name
ya no existe en python3, por lo que debe usarlofunc.__name__
si desea compatibilidadEsta función devolverá el nombre de la función del llamante.
Es como la respuesta de Albert Vonpupp con una envoltura amigable.
fuente
Si también está interesado en los métodos de clase, Python 3.3+ tiene
__qualname__
además__name__
.fuente
Me gusta usar un decorador de funciones. Agregué una clase, que también multiplica el tiempo de la función. Suponga que gLog es un registrador de python estándar:
así que ahora todo lo que tienes que hacer con tu función es decorarlo y listo
fuente
dónde
apilar () [0] la persona que llama
stack () [3] el nombre de cadena del método
fuente
stack()[0]
siempre será la persona que llama,[3]
el nombre de la cadena del método.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:
fuente
sys._getframe()
no se garantiza que esté disponible en todas las implementaciones de Python ( consulte la referencia ), puede usar eltraceback
módulo para hacer lo mismo, por ejemplo.Una llamada a
stack[-1]
devolverá los detalles del proceso actual.fuente
sys._getframe()
no está definido, entoncestraceback.extract_stack
tampoco funciona. El último proporciona un superconjunto aproximado de la funcionalidad del primero; no puedes esperar ver uno sin el otro. Y de hecho, en IronPython 2.7extract_stack()
siempre regresa[]
. -1Solo desea obtener el nombre de la función aquí, es un código simple para eso. digamos que tienes estas funciones definidas
la salida será function1
Ahora digamos que tiene estas funciones en una lista
para obtener el nombre de las funciones
la salida será
función1
función2
función3
fuente
He visto algunas respuestas que utilizan decoradores, aunque sentí que algunas eran un poco detalladas. Aquí hay algo que uso para registrar nombres de funciones, así como sus respectivos valores de entrada y salida. Lo he adaptado aquí para imprimir la información en lugar de crear un archivo de registro y lo he adaptado para aplicarlo al ejemplo específico de OP.
Salida:
fuente
debug
función una vez que puede agregar la funcionalidad simplemente agregando el decorador a cualquier función que necesite o desee imprimir el nombre de la función. Parece ser el más fácil y el más adaptable.