[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