¿Cuál es la mejor manera de llamar a una función dada una cadena con el nombre de la función en un programa de Python? Por ejemplo, digamos que tengo un módulo foo
, y tengo una cadena cuyo contenido es "bar". ¿Cuál es la mejor manera de llamar a
foo.bar()`?
Necesito obtener el valor de retorno de la función, y por eso no uso simplemente eval
. He descubierto cómo hacerlo usando eval
para definir una función temporal que devuelva el resultado de la llamada a la función, pero espero que haya una forma más elegante de hacerlo.
Asumiendo el módulo foo
con el método bar
:
import foo
method_to_call = getattr(foo, 'bar')
result = method_to_call()
Podrías acortar las líneas 2 y 3 a:
result = getattr(foo, 'bar')()
si eso tiene más sentido para su caso de uso.
Puedes usar getattr
de esta manera en métodos vinculados a la instancia de la clase, métodos a nivel de módulo, métodos de clase... la lista continúa.
La solución de Patrick es probablemente la más limpia. Si necesita recoger dinámicamente el módulo también, puede importarlo como:
module = __import__('foo')
func = getattr(module, 'bar')
func()