[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