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, {}, {"sheerka": context.sheerka}) 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: raise NotImplementedError()