creando un objeto de función a partir de una cadena

Pregunta: ¿hay una manera de hacer que un objeto de función en python use cadenas?


Información: Estoy trabajando en un proyecto en el que almaceno datos en un servidor de servidor sqlite3. nada de loco por eso. una clase DAL se realiza con mucha frecuencia a través de la generación de código porque el código es increíblemente mundano. Pero eso me dio una idea. En Python, cuando no se encuentra un atributo, si define la función ” getattr “, llamará a eso antes de que cometa errores. de modo que, tal como lo imagino, a través de un analizador y un árbol lógico, podría generar dinámicamente el código que necesito en su primera llamada, luego guardar el objeto de función como un atributo local. por ejemplo:

DAL.getAll() #getAll() not found, call __getattr__ DAL.__getattr__(self,attrib)#in this case attrib = getAll ##parser logic magic takes place here and i end up with a string for a new function ##convert string to function DAL.getAll = newFunc return newFunc 

He probado la función de comstackción, pero exec, y eval están lejos de ser satisfactorios en términos de poder lograr este tipo de hazaña. Necesito algo que permita múltiples líneas de función. ¿Hay otra forma de hacer esto además de las que no implica escribirlo en el disco? De nuevo estoy tratando de hacer un objeto de función dinámicamente .

PD: sí, sé que esto tiene horribles problemas de seguridad y estabilidad. Sí, sé que esta es una manera horriblemente ineficiente de hacer esto. ¿Qué me importa? no. Esta es una prueba de concepto. “¿Python puede hacer esto? ¿Puede crear dinámicamente un objeto de función? ” es lo que quiero saber, no una alternativa superior. (aunque siéntase libre de agregar alternativas superiores después de haber respondido a la pregunta en cuestión)

Lo siguiente pone los símbolos que define en su cadena en el diccionario d:

 d = {} exec "def f(x): return x" in d 

Ahora d [‘f’] es un objeto de función. Si desea utilizar variables de su progtwig en el código de su cadena, puede enviar esto a través de d:

 d = {'a':7} exec "def f(x): return x + a" in d 

Ahora d [‘f’] es un objeto de función que está enlazado dinámicamente a d [‘a’]. Cuando cambia d [‘a’], cambia la salida de d’f ‘.

Si es simplemente una prueba de concepto, entonces eval y exec están bien, también puedes hacer esto con cadenas de encurtidos, cadenas de yaml y cualquier otra cosa para la que escribas un constructor.

no puedes hacer algo como esto?

 >>> def func_builder(name): ... def f(): ... # multiline code here, using name, and using the logic you have ... return name ... return f ... >>> func_builder("ciao")() 'ciao' 

básicamente, ensamblar una función real en lugar de ensamblar una cadena y luego tratar de comstackrla en una función.