¿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, supongamos que tengo un módulo foo
y tengo una cadena cuyo contenido es "bar"
. ¿Cuál es la mejor forma de llamar foo.bar()
?
Necesito obtener el valor de retorno de la función, por eso no solo uso eval
. Descubrí cómo hacerlo utilizando eval
para definir una función temporal que devuelve el resultado de esa llamada de función, pero espero que haya una forma más elegante de hacerlo.
foo
módulo, puedes usarloglobals()
para hacer esto:methodToCall = globals()['bar']
o
locals devuelve un diccionario con una tabla de símbolos local actual. globals devuelve un diccionario con tabla de símbolos global.
fuente
La solución de Patrick es probablemente la más limpia. Si necesita recoger dinámicamente el módulo también, puede importarlo como:
fuente
importlib.import_module
. Los documentos oficiales dicen sobre__import__
: "Esta es una función avanzada que no es necesaria en la programación diaria de Python, a diferencia de importlib.import_module ()". docs.python.org/2/library/functions.html#__import__importlib.import_module
es compatible con 3.6. Ver docs.python.org/3.6/library/…Solo una simple contribución. Si la clase que necesitamos instanciar está en el mismo archivo, podemos usar algo como esto:
Por ejemplo:
Y, si no es una clase:
fuente
Dada una cadena, con una ruta completa de Python a una función, así es como obtuve el resultado de dicha función:
fuente
__import__
función.La mejor respuesta según las preguntas frecuentes de programación de Python sería:
fuente
La respuesta (espero) que nadie haya querido
Evaluar como comportamiento
¿Por qué no agregar la importación automática?
En caso de que tengamos diccionarios adicionales, queremos verificar
Necesitamos ir más profundo
fuente
Para lo que vale, si necesita pasar el nombre de la función (o clase) y el nombre de la aplicación como una cadena, puede hacer esto:
fuente
handler = getattr(sys.modules[__name__], myFnName)
Prueba esto. Si bien esto todavía usa eval, solo lo usa para invocar la función desde el contexto actual . Entonces, tiene la función real de usar como desee.
El principal beneficio para mí de esto es que obtendrá errores relacionados con la evaluación al momento de invocar la función. Entonces obtendrá solo los errores relacionados con la función cuando llame.
fuente
eval
menos que sea estrictamente necesario.getattr(__module__, method_name)
Es una opción mucho mejor en este contexto.nada de lo sugerido me ayudó. Aunque descubrí esto.
Estoy usando python 2.66
Espero que esto ayude
fuente
self.__getattribute__('title')
es igual aself.title
self.__getattribute__('title')
no funciona en todos los casos (no sé por qué) después de todo, pero lofunc = getattr(self, 'title'); func();
hace. Así, tal vez es mejor utilizargetattr()
en su lugargetattr
lugar.Como esta pregunta Cómo llamar dinámicamente métodos dentro de una clase usando la asignación de nombre de método a una variable [duplicado] marcada como duplicada como esta, estoy publicando una respuesta relacionada aquí:
El escenario es que un método en una clase quiere llamar a otro método en la misma clase dinámicamente. He agregado algunos detalles al ejemplo original que ofrece un escenario y claridad más amplios:
fuente
Esta es una respuesta simple, esto le permitirá borrar la pantalla, por ejemplo. Hay dos ejemplos a continuación, con eval y exec, que imprimirán 0 en la parte superior después de la limpieza (si está utilizando Windows, cambie
clear
acls
, los usuarios de Linux y Mac se van como están, por ejemplo) o simplemente ejecútelo, respectivamente.fuente