miércoles, 9 de febrero de 2011

eval y exec en Python

Un recordatorio a mi mismo y a quien pueda ser útil ... si se desease por ejemplo, crear variables enteras a1, a2, a3, a4 y a5 cuyos valores respectivos sean: 2, 4 ,6 ,8 y 10, esto inicialmente lo podríamos hacer con:
a1 = 2
a2 = 4
a3 = 6
a4 = 8
a5 = 10

print a1
print a2
print a3
print a4
print a5

.. pero .. y si fuesen demasiadas variables ¿?

Para estos casos, podriamos usar la declaración exec que nos permite ejecutar instrucciones en el intérprete de python.
for i in range(5):
    var='a'+str(i+1)
    exec "%s=2*(i+1)" %var
    exec "print %s" %var

De esta manera podemos cambiar la cantidad de variables a nuestro gusto simplemente cambiando el range(5).

* Tambien, ... una función a tener en cuenta es eval, que evalúa una expresión, por ejemplo:

print eval('2+2')
print eval('(2.0*5)/3')

>> exec
>> eval

2 comentarios:

Juan Carlos dijo...

Gracias por el post, me resultó muy útil para una apliacición que intento hacer de resolver sudokus y no quería hacer 81 entrys.

Pero tengo un problema, y es que no una vez creadas las variables, no puedo acceder a ellas. Por ejemplo, si pruebas el código que has puesto

for i in range(5):
var='a'+str(i+1)
exec "var=2*(i+1)"
exec "print var"

print a1
print a2
print a3
print a4
print a5


Verás que cuando acabe el bucle no puedes acceder a ellas.

Alexander dijo...

Gracias por el aviso, no lo había notado, lo he corregido editando las dos últimas lineas:

exec "var=2*(i+1)"
exec "print var"

por:

exec "%s = 2*i" %var
exec "print %s" %var

Ahora sí se puede acceder desde fuera.