ValueError: malformed string when using ast.literal_eval

前端 未结 5 1746
眼角桃花
眼角桃花 2020-11-28 14:08

It is widely known that using eval() is a potential security risk so the use of ast.literal_eval(node_or_string) is promoted

However In python 2.7 it re

5条回答
  •  谎友^
    谎友^ (楼主)
    2020-11-28 14:46

    An updated version of the answer from @poke that allows negative numbers in py3.x or other unary operators. So "-3" evaluates to -3 for example, rather than an error.

    import ast, operator
    
    binOps = {
    ast.Add: operator.add,
    ast.Sub: operator.sub,
    ast.Mult: operator.mul,
    ast.Div: operator.truediv,
    ast.Mod: operator.mod
    }
    
    unOps = {
    ast.USub: operator.neg
    }
    
    node = ast.parse(s, mode='eval')
    
    def arithmetic_eval(s):
        binOps = {
        ast.Add: operator.add,
        ast.Sub: operator.sub,
        ast.Mult: operator.mul,
        ast.Div: operator.truediv,
        ast.Mod: operator.mod
        }
    
        unOps = {
        ast.USub: operator.neg
        }
    
        node = ast.parse(s, mode='eval')
    
        def _eval(node):
            if isinstance(node, ast.Expression):
                return _eval(node.body)
            elif isinstance(node, ast.Str):
                return node.s
            elif isinstance(node, ast.Num):
                return node.n
            elif isinstance(node, ast.BinOp):
                return binOps[type(node.op)](_eval(node.left), _eval(node.right))
            elif isinstance(node, ast.UnaryOp):
                return unOps[type(node.op)](_eval(node.operand))
            else:
                raise Exception('Unsupported type {}'.format(node))
    
        return _eval(node.body)
    

提交回复
热议问题