当前位置: 首页 > 面试题库 >

为什么ast.literal_eval('5 * 7')失败?

翟俊远
2023-03-14
问题内容

为什么字面上的评估5 * 7失败,而5 + 7没有呢?

import ast

print(ast.literal_eval('5 + 7'))
# -> 12

print(ast.literal_eval('5 * 7'))
# -> 
Traceback (most recent call last):
  ...
ValueError: malformed node or string: <_ast.BinOp object at ...>

该文档没有对此进行解释。

我在回答以下问题后发现了这个问题:获取字符串的结果。


问题答案:

ast.literal_eval()接受+评估的数据,因为5+2j(复数*)是有效的文字。同样适用于-。为了使代码简单,没有尝试排除+或将其-作为二进制运算符。

不允许其他运算符;该函数 应该 只接受文字,不接受表达式。

换句话说,这5 + 7是一个错误,但如果不中断对构造复数的支持,就很难修复该错误。该实现将使用范围限制为数字,一元+-或其他二进制运算符(因此,您不能使用它们来连接列表或产生集合差)。

另请参阅几个相关的Python Bugtracker 条目:#25335
ast.literal_eval无法解析
以前


+”表示的数字
,#22525
ast.literal_eval()未按文档所述执行操作,
并且#4907 ast.literal_eval无法正确处理复数

*从技术上讲2j是有效的文字;Python解析5+2jint(5) binop(+) complex(0, 2),并且仅在以后complex(5, 2)实际执行加法运算时才从结果中生成一个对象。



 类似资料:
  • 问题内容: 在回答了有关如何解析包含浮点数数组的文本文件的问题之后,我运行了以下基准测试: 我多次运行此代码,并始终得到以下结果: 因此,似乎比此用例快了一个数量级。 使用Python 2.7.5+和Python 3.3.2+的结果相同。 问题: 为什么json.loads这么快?这个问题似乎暗示ast在输入数据(双引号或单引号)方面更灵活 在某些使用案例中,尽管速度较慢,但我还是更愿意使用它吗?

  • 问题内容: 我有一个字典,它以字符串形式存储在db字段中。我试图将其解析为字典,但给我一个错误。 为什么会失败并起作用?一个比另一个更好吗? 问题答案: 失败,因为您的值不是有效的JSON文档。在有效文档中,字符串用双引号引起来,并且没有类似将字符串转换为unicode的方法。 使用方法将文档反序列化 在需要评估评估表达式时使用。如果您有Python表达式作为您要评估的输入。 一个比另一个更好吗?

  • 我的理解是 x == 0 首先运行。但是 x 在计算时仍然是 -1 (y = y / x) == 0?否则它将除以零。我以为输出将是 -5,但日食说 5。我快疯了。

  • 问题内容: 当返回的数据不是有效的JSON时,jQuery 静默失败似乎非常不便。为什么用无声失败来实现呢?用更好的故障行为(例如,引发异常或其他方法)执行getJSON的最简单方法是什么? 问题答案: 您可以使用 如果要查看错误原因,请使用完整版本 如果您的JSON格式不正确,则会看到类似 如果网址错误,您会看到类似 如果您试图从另一个域获取JSON,则违反Same-origin策略,则此方法将

  • 问题内容: 当我打开JMeter仪表板时,我可以在列中看到成功,而在列中看到失败。根据城市词典 KO等于OK “ KO”等价于表示“ OK”的字母的含义和缩写 还是法国的非正式缩写? 我注意到,法语和意大利语非正式交流中的首字母缩写词KO意味着“不好” 我看到了有关将KO标签更改为失败的不同问题。 为什么JMeter将错误称为,在性能测试中还有其他含义吗?还是在积极思考失败也可以的地方? 问题答案

  • 问题内容: Java 5以Executor框架的形式引入了对线程池执行异步任务的支持,其核心是java.util.concurrent.ThreadPoolExecutor实现的线程池。Java 7以java.util.concurrent.ForkJoinPool的形式添加了备用线程池。 查看它们各自的API,ForkJoinPool在标准情况下提供了ThreadPoolExecutor功能的超