- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
众所周知,使用 eval()
存在潜在的安全风险,因此使用 ast.literal_eval(node_or_string)
升职了
但是在 python 2.7 中,它在运行这个例子时返回 ValueError: malformed string
:
>>> ast.literal_eval("4 + 9")
而在 python 3.3 中,此示例按预期工作:
>>> ast.literal_eval('4+9')
13
为什么它在 python 3 而不是 python 2 上运行?如何在不使用有风险的 eval()
函数的情况下在 python 2.7 中修复它?
最佳答案
这在 Python 2 上不起作用的原因在于它对 literal_eval
的实现。当右边的操作数是复数时,原始实现仅对加法和减法执行数字评估。这在语法上对于将复数表示为文字是必要的。
这个 was changed在 Python 3 中,它支持任何类型的有效数字表达式位于加法和减法的任一侧。但是,literal_eval
的使用仍然仅限于加减法。
这主要是因为 literal_eval
应该是一个将单个 constant 文字(表示为字符串)转换为 Python 对象的函数。有点像简单的内置类型的向后 repr
。不包括实际的表达式求值,而且它适用于 Python 3 的事实只是其实现的一个很好的副作用。
为了评估实际表达式,无需使用 eval
(我们不想这样做),我们可以编写自己的表达式评估算法,该算法在 AST 上运行。这非常简单,尤其是对于数字的简单算术运算(例如构建您自己的计算器等)。我们只需将字符串解析为 AST,然后通过查看不同的节点类型并应用正确的操作来评估结果树。
类似这样的:
import ast, operator
binOps = {
ast.Add: operator.add,
ast.Sub: operator.sub,
ast.Mult: operator.mul,
ast.Div: operator.div,
ast.Mod: operator.mod
}
def arithmeticEval (s):
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))
else:
raise Exception('Unsupported type {}'.format(node))
return _eval(node.body)
如您所见,此实现非常简单。当然它还不支持更复杂的东西,比如求幂和一些一元节点,但添加它并不太难。而且效果很好:
>>> arithmeticEval('4+2')
6
>>> arithmeticEval('4*1+2*6/3')
8
你甚至可以在以后引入更复杂的东西(例如像 sin()
这样的函数调用)。
关于python - ValueError : malformed string when using ast. literal_eval,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20748202/
我想递归解压缩一些存档 .zip。我使用 java.util.zip,但无法使用其他库。 我的代码: public static void unzip(String file) { try {
我手头的任务是能够根据地址中的文本文件处理行,并将它们分类到各自的类别中,“东”、“西”、“百老汇”、“大道”和“坏 ID” 。下面的代码可以 100% 正确地执行此操作,直到遇到包含双逗号的格式错误
这个网址 'http://profile.myspace.com/index.cfm?fuseaction=user.viewProfile&friendID=39726387 ' 在浏览器中工作得很
我不确定它发生在哪一点,但我最终得到了一个像这样的向量: vec #Levels: first second 您应该调查为什么存在格式错误的因素并修复它。 关于r - 如何修复 'malforme
我收到此错误 'Page' ionViewWillEnter error: URI malformed 这会阻止我的应用程序运行。我不知道发生了什么事。这是我的 ionic 信息和有关错误的屏幕截图。
我正在尝试构建启用了调试符号 (-g) 的 C++ 软件。问题是额外的调试符号使包含的库太大以至于最终链接步骤失败 ../../lib/libutil.a:无法读取符号:格式错误的存档 (至少我认为它
JavaScript的最佳实践是使用一些惯用法来检测错误,而不是依赖try-catch。轻松实现TypeError: if (typeof foo !== "number") { console.
我是 dart 新手,我正在尝试使用隔离来运行多个算法以更有效地多次运行它们,但是,当使用 Isolate.spawn 调用多个函数时,我开始在控制台中收到“格式错误的消息”,它仍然有效,但我想知道为
感谢 this question 的精彩回复我了解如何使用可变参数调用 javascript 函数。 现在我希望使用与构造函数一起应用 我发现了一些有趣的信息on this post . 但是我的代码
我正在使用 Postman 查询图形 API 以获取我的 AAD 实例上的应用程序列表。 验证网址:https://login.microsoftonline.com/common/oauth2/au
我寻求有关以下问题的帮助:在从“Oracle Database 12c 版本 12.1.0.1.0 - 64 位生产”中选择数据时,观察到大量“格式错误的数据包:TNS”(使用wireshark 版本
我正在使用 Postman 查询图形 API 以获取我的 AAD 实例上的应用程序列表。 验证网址:https://login.microsoftonline.com/common/oauth2/au
我有一个 Android 应用程序,它在后台执行一些网络处理,从 https://ipinfo.io/json 处的 json api 请求信息。 。 bufferReader httpConnect
尝试将对象发布到索引时,我收到以下响应: { "message": "lexical error: malformed number, a digit is required after the
我想在我的服务器上上传几组视频,然后在 HTML5 视频标签中播放它们。但是其中一些没有播放。 我检查了视频的音频流和视频流,它们分别有AAC 和H264 编解码器。所以我觉得没有问题。 然后我尝试重
我正在尝试按照 here 中的描述做一个嵌套的中继器但它出错了。 我的中继器如下: ">
QueryText = string.Format("SELECT {0}, {1} Path FROM Scope() " + "WH
由于 unescape 已被弃用,我选择了 decodeURIComponent ,但它没有按预期工作。 decodeURIComponent 无法解码以下 URI 组件 Coast%20Guard%
我正在创建一个必须连接到 Activity 目录的应用程序。 我实际上在处理更新组成员时遇到了问题。 组名是:GG-Collaboration-AgenceXXX 这是我抛出异常的 GroupRepo
我正在尝试使用 Joda 库的 DateTimeFormatter 从字符串中解析 DateTime 对象。由于某种原因,它在到达要解析的时区时抛出异常。 这是我的代码: protected
我是一名优秀的程序员,十分优秀!