为什么字面上的评估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+2j
为int(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功能的超