Python 是否存在未记录的ast.literal\u评估限制?
使用python 3.4,可以:Python 是否存在未记录的ast.literal\u评估限制?,python,literals,Python,Literals,使用python 3.4,可以: >>> ast.literal_eval("2 - 1") 1 但事实并非如此: >>> ast.literal_eval("1 | 2") raise ValueError('malformed node or string: ' + repr(node)) ValueError: malformed node or string: <_ast.BinOp object at 0x0000000003338978&g
>>> ast.literal_eval("2 - 1")
1
但事实并非如此:
>>> ast.literal_eval("1 | 2")
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.BinOp object at 0x0000000003338978>
>>> ast.literal_eval("1 ^ 2")
raise ValueError('malformed node or string: ' + repr(node))
ValueError: malformed node or string: <_ast.BinOp object at 0x0000000003338400>
>>ast.literal_eval(“1 | 2”)
raise VALUERROR('格式错误的节点或字符串:'+repr(节点))
ValueError:节点或字符串格式不正确:
>>>最后文字评估(“1^2”)
raise VALUERROR('格式错误的节点或字符串:'+repr(节点))
ValueError:节点或字符串格式不正确:
所有的值都是文本,当它可以执行加法、减法时,执行逻辑运算并没有困难
为什么我不能使用ast.literal\u eval执行逻辑操作?因为它在Python 2.7中
乍一看,只支持添加以启用complex
文本,如1+2j
,因为它拒绝2j+1
在Python3.5中,是,并且没有以这种方式限制添加。它只是没有以这种方式实现。唯一的“白名单”操作符是Add
和Sub
这可以作为错误报告提交给,请求更多操作员的支持。我认为这与不断折叠有关,但似乎不是这样,因为1 | 2
似乎正确地折叠到3
(根据dis
模块)。@ukaszRogalski另外,>>ast.dump(ast.parse(“1^2”)”模块(body=[Expr(value=BinOp(left=Num(n=1),op=BitXor(),right=Num(n=2))))“@pradyunsg:ast
不做任何固定的折叠,所以我不确定你想表达什么意思make@Eric常量折叠不会在ast级别发生。至少在ast.parse
的结果出现之前。哈。你比我快。不。Python 3.5仍然限制它。@pradyunsg:Tryast.literal\u eval('2j+1'))
。适用于3.5,但不适用于2.7。因此3.5没有那么严格啊。我以为你在比较3.4和3.5。你是对的,添加了对Add和Sub的支持以支持复杂文字,请参阅。