首页 > 解决方案 > 具有 __name__ 属性的 Pickle Mock/MagicMock 对象

问题描述

Mock/MagicMock 没有默认__name__属性,我是手动添加的。

运行以下代码片段时:

import pickle
from mock import MagicMock

m = MagicMock()
m.__name__ = 'my name'
m.__reduce__ = lambda self: (MagicMock, ())

print(m.__name__)

b = pickle.dumps(m)

pickled_m = pickle.loads(b) 
print(pickled_m.__name__) 

我收到一个错误:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/Users/.../.pyenv/virtualenv/lib/python3.6/site-packages/mock/mock.py", line 716, in __getattr__
    raise AttributeError("Mock object has no attribute %r" % name)
AttributeError: Mock object has no attribute '__name__'

如何指示 pickle 序列化__name__属性?

标签: pythonpickle

解决方案


您的问题不在于pickle,您的MagicMock类具有__getattr__魔术方法的自定义实现,这会在某些情况下引发AttributeError异常。为了证明这一点,下面的代码:

import pickle
class A():
  a = 10

a = A()
a.__name__ = "A"
ap = pickle.dumps(a)
na = pickle.loads(ap)
print(na.__name__)

将输出:

'A'

所以__name__腌制和解封没有问题。


推荐阅读