Python 是否存在未记录的ast.literal\u评估限制?

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

使用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>

>>> 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:Try
ast.literal\u eval('2j+1'))
。适用于3.5,但不适用于2.7。因此3.5没有那么严格啊。我以为你在比较3.4和3.5。你是对的,添加了对Add和Sub的支持以支持复杂文字,请参阅。