python - 使用 python 的 eval() 与 ast.literal_eval()

标签 python eval abstract-syntax-tree

我遇到了一些代码的情况,其中 eval() 是一种可能的解决方案。现在,我以前从未使用过 eval(),但是,我发现了大量关于它可能导致的潜在危险的信息。也就是说,我对使用它非常谨慎。

我的情况是我有用户给出的输入:

datamap = input('Provide some data here: ')

datamap 需要是字典。我四处搜索,发现 eval() 可以解决这个问题。我认为我可以在尝试使用数据之前检查输入的类型,这将是一种可行的安全预防措施。

datamap = eval(input('Provide some data here: ')
if not isinstance(datamap, dict):
    return

我通读了文档,但我仍然不清楚这是否安全。 eval 是在输入数据后立即评估数据还是在调用 datamap 变量后评估数据?

ast 模块的 .literal_eval() 是唯一安全的选择吗?

最佳答案

datamap = eval(input('Provide some data here: ')) 表示您实际上评估代码之前您认为它不安全或不安全。它会在调用函数后立即评估代码。另见 the dangers of eval .

ast.literal_eval如果输入不是有效的 Python 数据类型,则引发异常,因此如果不是,则不会执行代码。

在需要时使用 ast.literal_eval eval .您通常不应该评估文字 Python 语句。

关于python - 使用 python 的 eval() 与 ast.literal_eval(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15197673/

相关文章:

php - 什么时候(如果有的话)eval 不是邪恶的?

ASP.NET 控件中的 Eval if else 语句?

lisp - 如果 Lisp 源代码基本上是一个 AST,那是否意味着 Lisp 宏是语言不可知的?

methods - 编译器/解释器设计 : should built in methods have their own Node or should a lookup table be used?

python - 如何找到多边形内的点?

python - 在元组上分配字符串

python - 每次从每个文件中插入 2 行或更多行的多个文件

python - Scrapy 提取ld+JSON

perl - 如何将参数传递给使用 eval 定义的 Perl 子例程?

java - 将java代码解析成抽象语法树