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

Resuelto X10 asked hace 16 años • 14 respuestas

¿Cómo obtengo el nombre de una función como una cadena?

def foo():
    pass

>>> name_of(foo)
"foo"
X10 avatar Oct 31 '08 02:10 X10
Aceptado
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.

user28409 avatar Nov 01 '2008 00:11 user28409

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._getframetambién funciona en lugar de inspect.currentframeaunque este último evita acceder a una función privada.

Para obtener el nombre de la función que llama, considere f_backcomo 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
Albert Vonpupp avatar Nov 22 '2012 13:11 Albert Vonpupp