Python Can';t在重新加载枚举后对其进行pickle:不是同一个对象

Python Can';t在重新加载枚举后对其进行pickle:不是同一个对象,python,enums,pickle,python-importlib,Python,Enums,Pickle,Python Importlib,这是我上一个问题的后续问题: 最终,我希望能够对我的枚举进行pickle 让我们再次从myenum.py开始: #myenum.py 导入枚举 MyEnum类(enum.enum): 一=1 二=2 我再次在脚本中导入此文件。我创建了一个变量a一个MyEnum的实例,对其进行pickle处理并将其加载到变量b中。它工作正常,两个变量相等 现在,我重新加载我的文件。我尝试picklea,但出现以下错误: Traceback (most recent call last): File &quo

这是我上一个问题的后续问题:

最终,我希望能够对我的枚举进行pickle

让我们再次从
myenum.py
开始:

#myenum.py
导入枚举
MyEnum类(enum.enum):
一=1
二=2
我再次在脚本中导入此文件。我创建了一个变量
a
一个
MyEnum
的实例,对其进行pickle处理并将其加载到变量
b
中。它工作正常,两个变量相等

现在,我重新加载我的文件。我尝试pickle
a
,但出现以下错误:

Traceback (most recent call last):
  File "f:/python_test/test.py", line 8, in <module>
    b = pickle.loads(pickle.dumps(a))
_pickle.PicklingError: Can't pickle <enum 'MyEnum'>: it's not the same object as myenum.MyEnum

简短回答:停止使用
reload
。这是一种在积极开发过程中使用的黑客,而不是用于生产

如果这只是为了交互式会话中的主动开发,请将
枚举
的定义移到您正在主动编辑和
重新加载
的模块之外的某个位置,这样它就不会陷入
重新加载
的过程中。否则,你就会陷入困境<代码>pickle准确地描述了错误。在
重新加载之后
a
(旧的
myenum.myenum.ONE
)与
myenum.myenum.ONE
(就此而言,
a
的类与
myenum.myenum
无关)。当然,它在逻辑上的定义可能是相同的,但类和实例都是从头重新定义的,并且给出了
enum
(来自:“在枚举中,成员可以通过标识进行比较”)的关键卖点,它们不是同一个对象这一事实意味着它们不相等。您要求
pickle
获取一个类
pickle
找不到的对象,并将其序列化,以便可以复制它,但该类已不存在
pickle
无法从中复制对象,因为它无法在代码中任何可靠的位置查找类(如果它尝试导入新的模块,它可能会使新的
ONE
,但旧的
ONE
不等于当前的
ONE


如果不调用最可怕、最脆弱的黑客,你就无法解决这个问题。所以不要这样做;找到一种方法来避免
重新加载
必须酸洗的东西。

我可以问一下,在酸洗
枚举
时,您想要达到什么目的吗?“现在,我重新加载我的文件。”-祝贺您,您已经遇到了为什么模块重新加载是一个可怕的主意的原因之一,您永远不应该依赖它。这与更改ID无关。对象ID不能更改。重新加载模块已创建了一个全新的枚举类,其中包含全新的实例。@DeepSpace的最终目标不是单独pickle枚举,而是一个可能具有一个或多个枚举属性的对象。为了演示,我简化了示例。旁注:为什么
importlib.reload(globals()[“myenum”])
而不是
importlib.reload(myenum)
?感觉上你并不真正理解代码在做什么,你正在对其应用奇怪的黑客攻击,你认为这会有所帮助,但什么都不会改变。