【问题标题】:Why does ast.literal_eval() seem to ignore declared variables?为什么 ast.literal_eval() 似乎忽略了声明的变量?
【发布时间】:2014-03-06 20:37:52
【问题描述】:

我听说 ast.literal_eval 比 eval() 安全得多,但是在更改我的代码时,我收到了“格式错误的字符串/节点”错误。

例如:

bar = False
incorrect = {"foo":bar}
correct = {"foo":"bar"}

ast.literal_eval(incorrect) 

返回错误但是

ast.literal_eval(correct) 

返回预期的 {"foo":"bar"}

为什么第一次评估不返回 {"foo":False}

【问题讨论】:

  • 也许你想在你的字典周围加上引号,否则为什么还要用 eval 呢? literal_eval('{"foo":"bar"}') 按预期工作。
  • 你想达到什么目的?
  • 我试图确保没有恶意代码进入程序,但我猜literal_eval就是这样做的,只评估文字。是否有比 eval() 更好的替代方案,它考虑到其他值,或者是我要求的矛盾?
  • 您是否尝试验证来自网站表单或类似内容的用户输入?如果是这样,不幸的是,这不是正确的方法。使用eval 是确保某些恶意代码进入您的程序的好方法
  • 听起来很像en.wikipedia.org/wiki/JSON,您可以在import json 那里工作。

标签: python dictionary eval


【解决方案1】:

因为它并不意味着这样做。来自文档:

安全地评估表达式节点或 Unicode 或 Latin-1 编码 包含 Python 表达式的字符串。提供的字符串或节点可能 仅由以下 Python 文字结构组成:字符串, 数字、元组、列表、字典、布尔值和无。

ast.literal_evaleval 旨在将 Python 代码的字符串表示形式转换为...有效的 Python 代码。

这不起作用:

>>> ast.literal_eval({"foo": "bar"})
Traceback (most recent call last):
  File "<input>", line 1, in <module>
  File "/usr/lib/python2.7/ast.py", line 80, in literal_eval
    return _convert(node_or_string)
  File "/usr/lib/python2.7/ast.py", line 79, in _convert
    raise ValueError('malformed string')
ValueError: malformed string <-- Telltale right here.

那是因为你已经有一个有效的 Python 结构,你正在尝试评估它。

如果你在整个内容周围加上引号,它将创建一个字典:

>>> ast.literal_eval('{"foo": "bar"}')
{'foo': 'bar'}

【讨论】:

    【解决方案2】:

    来自documentation 在 ast.literal_eval 上:

    安全地计算表达式节点或包含 Python 表达式的 Unicode 或 Latin-1 编码字符串。提供的字符串或节点只能由以下 Python 文字结构组成:字符串、数字、元组、列表、字典、布尔值和无。

    这可用于安全地评估来自不受信任来源的包含 Python 表达式的字符串,而无需自己解析值。

    bar 确实是False,但不是文字literal_eval 看不到变量。它只适用于文字。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 2018-11-09
      • 2020-05-02
      • 2013-02-27
      相关资源
      最近更新 更多