Python3 unpickle 字节对象的字符串表示形式

jeh*_*had 5 python pickle python-3.x

有没有一种好方法来加载表示为字符串的 bytes 对象,以便可以对其进行 unpickle?

基本示例

这是一个愚蠢的例子:

import pickle

mydict = { 'a': 1111, 'b': 2222 }
string_of_bytes_obj = str(pickle.dumps(mydict)) # Deliberate string representation for this quick example.

unpickled_dict = pickle.loads(string_of_bytes_obj) # ERROR!  Loads takes bytes-like object and not string.
Run Code Online (Sandbox Code Playgroud)

尝试解决方案

一种解决方案当然是eval字符串:

unpickled_dict = pickle.loads(eval(string_of_bytes_obj))
Run Code Online (Sandbox Code Playgroud)

但是,似乎是错误的eval,特别是当字符串可能来自网络或文件时。

...

对于更好的解决方案有什么建议吗?

谢谢!

tar*_*ras 7

出于安全考虑,您可以使用ast.literal_eval以下命令代替eval

>>> import ast
>>> pickle.loads(ast.literal_eval(string_of_bytes_obj))
{'b': 2222, 'a': 1111}
Run Code Online (Sandbox Code Playgroud)