def _compile_expr(self, expr, raise_on_missing=False): """ Compiles a purported Python expression to compiled code, verifies that it's safe (according to safe_eval's semantics) and alter its variable references to access values data instead :param expr: string """ namespace_expr = super()._compile_expr(expr, raise_on_missing=raise_on_missing) assert_valid_codeobj(_SAFE_QWEB_OPCODES, compile(namespace_expr, '<>', 'eval'), expr) return namespace_expr
def _compile_expr(self, expr): """ Compiles a purported Python expression to ast, verifies that it's safe (according to safe_eval's semantics) and alter its variable references to access values data instead """ # string must be stripped otherwise whitespace before the start for # formatting purpose are going to break parse/compile st = ast.parse(expr.strip(), mode='eval') assert_valid_codeobj( _SAFE_OPCODES, compile(st, '<>', 'eval'), # could be expr, but eval *should* be fine expr) # ast.Expression().body -> expr return Contextifier(_BUILTINS).visit(st).body
def _compile_expr(self, expr): """ Compiles a purported Python expression to ast, verifies that it's safe (according to safe_eval's semantics) and alter its variable references to access values data instead """ # string must be stripped otherwise whitespace before the start for # formatting purpose are going to break parse/compile st = ast.parse(expr.strip(), mode='eval') assert_valid_codeobj( _SAFE_OPCODES, compile(st, '<>', 'eval'), # could be expr, but eval *should* be fine expr ) # ast.Expression().body -> expr return Contextifier(_BUILTINS).visit(st).body
def _compile_expr(self, expr, raise_on_missing=False): """ Compiles a purported Python expression to compiled code, verifies that it's safe (according to safe_eval's semantics) and alter its variable references to access values data instead :param expr: string """ readable = io.BytesIO(expr.strip().encode('utf-8')) try: tokens = list(tokenize.tokenize(readable.readline)) except tokenize.TokenError: raise ValueError(f"Cannot compile expression: {expr}") namespace_expr = self._compile_expr_tokens(tokens, self._allowed_keyword + list(self._available_objects.keys()), raise_on_missing=raise_on_missing) assert_valid_codeobj(_SAFE_QWEB_OPCODES, compile(namespace_expr, '<>', 'eval'), expr) return namespace_expr