¿Cómo obtener el nombre de una función como una cadena?
¿Cómo obtengo el nombre de una función como una cadena?
def foo():
pass
>>> name_of(foo)
"foo"
my_function.__name__
El uso __name__
es el método preferido ya que se aplica uniformemente. 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 dobles indican al lector que se trata de un atributo especial. Como beneficio adicional, las clases y módulos __name__
también tienen un atributo, por lo que solo debes recordar un nombre especial.
Para obtener el nombre de la función o método actual desde su interior, considere:
import inspect
this_function_name = inspect.currentframe().f_code.co_name
sys._getframe
también funciona en lugar de inspect.currentframe
aunque este último evita acceder a una función privada.
Para obtener el nombre de la función que llama, considere f_back
como en inspect.currentframe().f_back.f_code.co_name
.
Si también usa mypy
, puede quejarse de que:
error: el elemento "Ninguno" de "Opcional[FrameType]" no tiene el atributo "f_code"
Para suprimir el error anterior, considere:
import inspect
import types
from typing import cast
this_function_name = cast(types.FrameType, inspect.currentframe()).f_code.co_name