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

Juan Pablo Hernández Vogt jphv.mail en gmail.com
Vie Mar 3 10:26:26 ART 2017


Buenos días gente,

Como todo nuevo en Python tengo un problema al usar eval() que no entiendo.
Parece que hay algo relacionado al evironment en el que es ejecutado.

Aquí un ejemplo mínimo que arroja el siguiente error:

*NameError: name 'CalculationMode' is not defined*


Si muevo la definicion de la clase *CalculationMode *a *base.py*, eval()
funcionará correctamente:

{'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?

Se puede hacer de forma simple o se debe pasar un "contexto" como parámetro?


Gracias por su tiempo!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.python.org.ar/pipermail/pyar/attachments/20170303/d638a1e7/attachment.html>


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