[pyar] Uso eval() para clase definida en otro archivo

Marcos Dione mdione en grulic.org.ar
Vie Mar 3 16:56:06 ART 2017


On Fri, Mar 03, 2017 at 10:26:26AM -0300, Juan Pablo Hernández Vogt wrote:
> {'passes': [-1, 0, -1, 0], 'DUMMY': True, 'GENERIC_NAME': 'dummy',
> 'AMBIENT_TEMPERATURE': 293, 'PRESSURE': 1013.25, 'MODE':
> <CalculationMode.Pass_3D: 1>}
> 
> 
> *File: base.py*
> class BaseObject(object):
>     def __init__(self, parameters=None):
>         self.parameters = parameters
> 
>     def load_parameter(self, key, value):
>         if self.parameters is None:
>             self.parameters = {}
> 
>         self.parameters[key] = eval(value)
> 
> 
> *File: derived.py*
> from base import *
> 
> # Using aenum from: https://pypi.python.org/pypi/aenum/1.4.5
> from aenum import Enum
> 
> class CalculationMode(Enum):
>     Pass_2D = 0
>     Pass_3D = 1
> 
> 
> class Derived(BaseObject):
>     def __init__(self, parameters=None):
>         super(Derived, self).__init__(parameters)
> 
> 
> if __name__ == "__main__":
> 
>     obj = Derived()
> 
>     obj.load_parameter('GENERIC_NAME', '"dummy"')
>     obj.load_parameter('AMBIENT_TEMPERATURE', '293')
>     obj.load_parameter('PRESSURE', '1013.25')
>     obj.load_parameter('DUMMY', 'True')
>     obj.load_parameter('passes', '[-1, 0, -1, 0]')
> 
>     print(obj.parameters)
> 
>     print("load enumeration")
>     obj.load_parameter('MODE', 'CalculationMode.Pass_3D')
>     print(obj.parameters)
> 
> 
> Entonces, cómo hago para que el eval() definido en una clase base sepa
> sobre tipos definidos en sus clases derivadas?

    yo empezaría no usando eval(), y preguntando: porqué (creés que)
necesitás eval()? si no tenés control sobre lo que te van a pasar en
value podes terminar ejecutando codigo arbitrario. muy seguramente hay
mejores opciones para lo que necesitas.

-- 
(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