[pyar] Cómo evito eval() en ésta situación?

Marcos Dione mdione en grulic.org.ar
Mie Ago 17 10:18:12 ART 2016


On Wed, Aug 17, 2016 at 09:43:50AM -0300, Gabriel Acosta wrote:
> Quiero deshacerme del uso de eval(), ésta porción de código implementa
> la operación `select` del álgebra relacional:

    antes que nada: estás seguro que querés largarte a hacer tu propio
ORM?

> class Relation(object):
>     def select(self, predicate):
>         for data in self.tuples:
>             for e, i in enumerate(self.header):
>                 _filter[i] = data[e]
>                 if eval(predicate, {}, _filter):
>                     new_rela.add(data)
> 
> r = Relation()
> r.select("age > 35")
> 
> Alguna alternativa más 'limpia'?

    la vas a tener que remar bastante, sobre todo a medida que vayas
agregando mas funcionalidad a los filtros. lo más simple que se me ocurre
(porque estoy usándolo mucho) es que te construyas un AST con
ast.parse(), revises que los datos están OK, y luego uses exec(...,
_filter). o sea, como eval(), pero asegurándote de que no te metan un
'import os; os.system ("rm -rf")'.

> Un abrazo?

    Sí, dale *hug*.

-- 
(Not so) Random fortune:
Terrorism isn't a crime against people or property. It's a crime against
our minds, using the death of innocents and destruction of property to
make us fearful.
	    -- Bruce Schneier


Más información sobre la lista de distribución pyar