with ¿Cómo logras que Python escriba el código de una función que tiene en la memoria?




udacity artificial intelligence (4)

Cuando paso las opciones en el programa (un experimento de biología computacional) generalmente las paso por un archivo .py.
Así que tengo este archivo .py que dice así:

starting_length=9
starting_cell_size=1000
LengthofExperiments=5000000

Luego ejecuto el archivo y obtengo la información. Como el programa está en mi máquina y nadie más tiene acceso a él, es seguro de una manera trivial.
También puedo escribir un archivo similar muy fácilmente:

def writeoptions(directory):
    options=""
    options+="starting_length=%s%s"%(starting_length,os.linesep)
    options+="starting_cell_size=%s%s"%(starting_cell_size,os.linesep)
    options+="LengthofExperiments=%s%s"%(LengthofExperiments,os.linesep)
...
    open("%s%soptions.py"%(directory,os.sep),'w').write(options)

Quiero pasar una función como uno de los parámetros:

starting_length=9
starting_cell_size=1000
LengthofExperiments=5000000

def pippo(a,b):
    return a+b
functionoperator=pippo

Y, por supuesto, en el experimento real, la función pippo será mucho más compleja. Y diferente de experimentar para experimentar.

Pero lo que no puedo hacer es escribir la función automáticamente. En resumen, no sé cómo generalizar la función writeoptions para seguir escribiendo las opciones, si una de las opciones es una función. Por supuesto, pude copiar el archivo original, pero esto es poco elegante, ineficiente (porque contiene muchas opciones adicionales que no se están usando) y generalmente no resuelve la pregunta.

¿Cómo logras que python escriba el código de una función, ya que anota el valor de una variable?


¿Estás preguntando sobre esto?

def writeoptions(directory):
    options=""
    options+="starting_length=%s%s"%(starting_length,os.linesep)
    options+="starting_cell_size=%s%s"%(starting_cell_size,os.linesep)
    options+="LengthofExperiments=%s%s"%(LengthofExperiments,os.linesep)
    options+="def pippo(a,b):%s" % ( os.linesep, )
    options+="    '''Some version of pippo'''%s" % ( os.linesep, )
    options+="    return 2*a+b%s" % ( os.linesep, )
    open("%s%soptions.py"%(directory,os.sep),'w').write(options)

¿O algo mas?


En lugar de sumergirse en el tema de desensambladores y códigos de bytes (por ejemplo, inspeccionar ), ¿por qué no guarda la fuente de Python generada en un módulo ( archivo.py ) y luego lo importa?

Sugeriría buscar una forma más estándar de manejar lo que usted llama opciones . Por ejemplo, puede usar el módulo JSON y guardar o restaurar sus datos. O mire en los módulos de mariscal y encurtido .



Si bien es posible hacer lo que pides (como ha demostrado Vinko), yo diría que es más limpio compartir el código . Coloque pippo y sus amigos en un submódulo al que puedan acceder ambos programas.





artificial-intelligence