簡體   English   中英

python eval vs ast.literal_eval vs JSON解碼

[英]python eval vs ast.literal_eval vs JSON decode

我正在將 2 MB 的數據作為字符串轉換為 dict。 輸入以 JSON 序列化。

無論如何,我目前正在使用 ast.literal_eval 並且我得到了我想要的字典,但是當我嘗試只運行 eval 時,它似乎運行得更快,並且還返回相同的結果。

當 eval 工作正常時,是否有任何理由使用 ast 模塊或 json 模塊?

我真的不喜歡在 stackoverflow(和其他地方)上的這種態度,在沒有任何背景的情況下告訴人們他們正在做的事情是不安全的,他們不應該這樣做。 也許它只是一個一次性腳本來導入一些數據,在這種情況下,為什么不選擇最快或最方便的方式呢?

但是,在這種情況下, json.loads不僅更安全,而且速度提高了 4 倍以上(取決於您的數據)。

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

如果您考慮一下,json 是一種比 python 更受約束的語言/格式,因此使用優化的解析器進行解析必須更快。

是的,肯定是有原因的: eval()是邪惡的。 您的代碼有一天可能會讀取不受信任的數據,這將允許攻擊者在您的機器上運行任意代碼。

您也不應該使用ast.literal_eval()來解碼 JSON。 它無法解碼每個有效的 JSON 字符串,也不打算用於此目的。 只需使用json.loads() ,它的速度相當快。

否。除非您遇到以下兩種情況之一:

  1. 那不是 JSON!

    有人將__import__('os').system('rm -rf /')放在文件中。 你有骨氣。

  2. 它是 JSON,但不是類似 Python 的部分!

    有人在其中的某處放置了truefalsenull或 Unicode 轉義符。 生日快樂。

不是確切的答案,但應該注意evalliteral_eval不是一回事。 ast.literal_eval不會運行任意代碼。

也就是說,我同意使用 JSON; 我只是想指出eval != literal_eval

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM