es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Salida recursiva de Python exec()?

Tengo este código de Python que ejecuta otro código y puedo obtener el resultado así:

def codeTester():
 try:
    loc = {}
    exec(code, {}, loc)
 except Exception as e:
   #Tratamiento de excepciones....
 result = loc['result']

Después de la ejecución, loc sería un diccionario y la clave “result” tendría la salida de la función.

Sin embargo, esto no funciona con funciones recursivas. Según https://stackoverflow.com/questions/871887/using-exec-with-recursive-functions y https://stackoverflow.com/questions/62835853/python3-inject-a-recursive-function-into-exec-in-a-function necesito envolver el código, lo cual hago usando la función del segundo enlace:

def wrap(s):
   return "def foo():\n" \
          "{}\n" \
          "foo()".format(textwrap.indent(s, ' ' * 4))

Esto envuelve el “código” con esa función y ahora el código recursivo se ejecuta, pero loc[] no contiene el resultado. Solo contiene una clave llamada “foo” que tiene este valor . ¿Cómo puedo obtener la salida en esta situación? ¿O hay un método mejor para lograr esto?

Edición: Debería señalar que algo como exec(code, locals(), locals()) también funciona, pero aún así tengo el mismo problema de no poder acceder a la salida de exec().

Tags:  ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando ejecutar una función recursiva y almacenar el resultado en un diccionario. Lamentablemente, esto no es posible con la función exec().

    Según la documentación de Python, la función exec() no devuelve un valor, por lo que no se puede almacenar el resultado en un diccionario.

    Podrías intentar usar la función eval() en su lugar, que sí devuelve un valor. Esto te permitiría almacenar el resultado en un diccionario.

    Como alternativa, podrías intentar usar un enfoque diferente para ejecutar la función recursiva, como utilizar un generador.

Comments are closed.