from core.builtin_concepts import BuiltinConcepts, ParserResultConcept from evaluators.BaseEvaluator import OneReturnValueEvaluator from parsers.PythonParser import PythonNode import ast import logging log = logging.getLogger(__name__) class PythonEvaluator(OneReturnValueEvaluator): def __init__(self): super().__init__("Python Evaluator", 50) def matches(self, context, return_value): return return_value.status and \ isinstance(return_value.value, ParserResultConcept) and \ isinstance(return_value.value.value, PythonNode) def eval(self, context, return_value): sheerka = context.sheerka node = return_value.value.value if isinstance(node.ast_, ast.Expression): try: log.debug(f"Evaluating python node {node}") compiled = compile(node.ast_, "", "eval") evaluated = eval(compiled, {}, self.get_locals(context)) return sheerka.ret(self.name, True, evaluated, parents=[return_value]) except Exception as error: error = sheerka.new(BuiltinConcepts.ERROR, body=error) return sheerka.ret(self.name, False, error, parents=[return_value]) else: return sheerka.ret(self.name, False, sheerka.new(BuiltinConcepts.ERROR), parents=[return_value]) @staticmethod def get_locals(context): my_locals = {"sheerka": context.sheerka} if context.obj: for prop_name, prop_value in context.obj.props.items(): my_locals[prop_name] = prop_value.value return my_locals