Pickle 自定义类和 unpickle 而无需访问这些类

问题描述 投票:0回答:1

是否可以将对象的类定义包含到 pickled 文件中,以便在不向这些类提供源代码的情况下对对象进行 unpickled?或者也许可以使用另一种序列化方法/标准......

酸洗:


>>> class A(object):
...   def __init__(self, foo):
...     self.foo = foo
...
>>>
>>> a = A('abc')
>>> a
<__main__.A object at 0x7f78ce7f3550>
>>> a.foo
'abc'
>>> import pickle
>>> with open('test.pickle', 'wb') as handle:
...     pickle.dump(a, handle, protocol=pickle.HIGHEST_PROTOCOL)
...
>>>

Unpickle 无法访问 A 类:

>>> import pickle
>>>
>>>
>>> with open('test.pickle', 'rb') as handle:
...     b = pickle.load(handle)
...
Traceback (most recent call last):
  File "<stdin>", line 2, in <module>
AttributeError: Can't get attribute 'A' on <module '__main__' (built-in)>

我正在尝试为一些测试用例创建测试数据,并且想知道这些测试用例是否可以与生成这些数据的代码分开执行。

python pickle
1个回答
0
投票

定义类:

import pickle

class A(object):
    def __init__(self, foo):
        self.foo = foo

创建对象:

a = A('abc')

将对象序列化为字节串:

serialized = pickle.dumps(a, protocol=pickle.HIGHEST_PROTOCOL)

将字节串写入文件:

with open('test.pickle', 'wb') as handle:
    handle.write(serialized)

从文件中读取字节串并反序列化:

with open('test.pickle', 'rb') as handle:
    serialized = handle.read()

b = pickle.loads(serialized)
print(b.foo)

输出:abc

© www.soinside.com 2019 - 2024. All rights reserved.