python eval vs ast.literal\u eval vs JSON解码

python eval vs ast.literal\u eval vs JSON解码,python,Python,我正在将2MB的数据作为字符串转换为dict。 输入是用JSON序列化的 无论如何,我目前正在使用ast.literal\u eval,我得到了我想要的字典,但是当我尝试运行eval时,它似乎运行得更快,并且返回了相同的结果 当eval工作正常时,是否有理由使用ast模块或json模块?是的,肯定有理由:eval()是邪恶的。您的代码有一天可能会读取不受信任的数据,这将允许攻击者在您的计算机上运行任意代码 您也不应该使用ast.literal\u eval()来解码JSON。它不能解码每个有效的

我正在将2MB的数据作为字符串转换为dict。 输入是用JSON序列化的

无论如何,我目前正在使用ast.literal\u eval,我得到了我想要的字典,但是当我尝试运行eval时,它似乎运行得更快,并且返回了相同的结果


当eval工作正常时,是否有理由使用ast模块或json模块?

是的,肯定有理由:
eval()
是邪恶的。您的代码有一天可能会读取不受信任的数据,这将允许攻击者在您的计算机上运行任意代码


您也不应该使用
ast.literal\u eval()
来解码JSON。它不能解码每个有效的JSON字符串,也不打算用于此目的。只需使用
json.loads()
,速度相当快。

否。除非您遇到以下两种情况之一:

  • 那不是JSON

    有人将
    \uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。你骨瘦如柴

  • 它是JSON,但不是类似Python的部分

    有人把
    true
    false
    null
    或Unicode转义放在其中的某个地方。生日快乐


  • 我真的不喜欢stackoverflow(和其他地方)的这种态度,在没有任何背景的情况下告诉人们他们所做的是不安全的,他们不应该这样做。也许这只是一个一次性的脚本来导入一些数据,那么为什么不选择最快或最方便的方式呢

    但是,在这种情况下,
    json.loads
    不仅更安全,而且速度快4倍以上(取决于您的数据)


    如果你想一想,json是一种比python更受约束的语言/格式,那么使用优化的解析器进行解析肯定会更快。

    这不是一个确切的答案,但应该注意的是,
    eval
    literal\u eval
    不是一回事。
    ast.literal\u eval
    不会运行任意代码


    也就是说,我同意使用JSON;我只是想指出,
    eval
    !=
    literal\u eval

    如果他们只能在自己的机器上运行它怎么办?(例如:他们下载并运行它)@Keikoku:那么,如果它不是你的机器,你不在乎吗?我想他们可以把它传播开来,用它做一些可疑的事情,并把我的工作归功于我。那么定义pyson怎么样?pyson是一种了不起的python/python交换/存储格式,它唯一的规范是:任何可以通过
    ast.literal_eval()无误解析的东西
    :)eval(json_str,{'false':false,'true':true,'null':None,{'code>:{})怎么样
    ?;-)@纳斯巴诺夫:看@JanusTroelsen,是的-看这个-似乎和时间有关too@NasBanov:现在试试
    json\u str='“\\u2603”
    。预期输出为
    u'\u2603'
    。取而代之的是
    '\\u2603'
    。你也无法从中找到出路。因此,这不仅仅是回答OP的问题:它也成为其他人阅读的参考。eval容易受到安全威胁。仅当您完全控制要评估的内容时才使用。如果您希望将字典与代码一起分发,只需将其放入Python模块并导入即可。这样,您就清楚了这是Python代码。
    In [1]: %timeit json.loads(data)
    10000 loops, best of 3: 41.6 µs per loop
    
    In [2]: %timeit eval(data)
    10000 loops, best of 3: 194 µs per loop
    
    In [3]: %timeit ast.literal_eval(data)
    1000 loops, best of 3: 269 µs per loop