Resolver operaciones matematicas simples

Chema Cortes py en ch3m4.org
Mar Abr 11 18:52:27 CEST 2006


Oswaldo Hernández escribió:
> Hola a todos,
> 
> Estoy buscando un modulo o funcion para resolver operaciones matematicas
> simples, es decir:
> 
> Teniendo el string "1250/25*4.2 que lo resuelva y devuelva el resultado.
> 
> Lo unico que he encontrado son modulos para calculo cientifico o
> calculadoras avanzadas. Mi necesidad es mucho mas simple, con que
> resulva las operaciones basicas es suficiente.
> 
> Como el string es generado por el usuario de la aplicacion, desearia
> evitar el uso de la funcion 'eval' para resolverlo.
> 
> ¿Alguien conoce algun módulo ligerito para hacer esto?

¿Por qué no quieres usar el "eval"? Se puede restringir su uso todo lo
que necesites para que el usuario no pueda ejecutar código malicioso. Lo
único que tienes que tener cuidado es en no dejarle acceso al módulo
__builtins__


>>> g={"__builtins__":{}}
>>> eval("1250/25*4.2",g)
210.0
>>> eval("dir()",g)
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
  File "<string>", line 0, in ?
NameError: name 'dir' is not defined


Según tus necesidades, puedes añadir los módulos que sean precisos:

>>> import cmath
>>> g["cmath"]=cmath
>>> eval("cmath.log(-1)",g)
3.1415926535897931j


Incluso mejor aún:

>>> g={"__builtins__":__builtins__} #reducimos "footprint"
>>> exec "from cmath import *" in g
>>> g["__builtins__"]={}
>>> eval("log(-1)",g)
3.1415926535897931j




Más información sobre la lista de distribución Python-es