Python Pickle Mock/MagicMock对象,具有_name____属性

Python Pickle Mock/MagicMock对象,具有_name____属性,python,pickle,Python,Pickle,Mock/MagicMock没有默认的\uuuu name\uuuu属性,我手动添加了它 运行以下代码段时: 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)

Mock/MagicMock没有默认的
\uuuu name\uuuu
属性,我手动添加了它

运行以下代码段时:

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__'
回溯(最近一次呼叫最后一次):
文件“”,第1行,在
文件“/Users/...pyenv/virtualenv/lib/python3.6/site packages/mock/mock.py”,第716行,位于__
raise AttributeError(“模拟对象没有属性%r”%name)
AttributeError:模拟对象没有属性“\u\u name\u”

如何指示pickle序列化
\uu name\uuuuuu
属性?

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

import pickle
class A():
  a = 10

a = A()
a.__name__ = "A"
ap = pickle.dumps(a)
na = pickle.loads(ap)
print(na.__name__)
将输出:

'A'
因此,
\uuuuuu name\uuuuuuu
正在被pickle和unpickle,没有任何问题