__getstate_manages_dict__ 是做什么的?
what does __getstate_manages_dict__ do?
我一直在研究多处理和 C++ 扩展,但我不太了解 __getstate_manages_dict__
函数(我知道如何使用它,但我不太确定它是如何工作的)。 boost/Python documentation for pickle support 是这样说的:
The author of a Boost.Python extension class might provide a __getstate__
method without considering the possibilities that: * his class is used in Python as a base class. Most likely the dict of instances of the derived class needs to be pickled in order to restore the instances correctly. * the user adds items to the instance's __dict__
directly. Again, the __dict__
of the instance then needs to be pickled.
To alert the user to this highly unobvious problem, a safety guard is
provided. If __getstate__
is defined and the instance's __dict__
is
not empty, Boost.Python tests if the class has an attribute
__getstate_manages_dict__
. An exception is raised if this attribute is not defined:
我见过一些示例,其中对象的 __dict__
在 __getstate__
中返回,然后在 __setstate__
中更新。 __dict__
指的是什么?它是派生的 class 对象的 __dict__
属性吗?另外,如果 pickle 调用 __init__
创建一个新对象然后设置属性,为什么需要显式处理这个字典?
谢谢
I know how to use it, but I'm not really sure how it works
这是一个布尔值,默认为 False。重点是向 Boost 发出信号,表明 __getstate__
/__setstate__
实现处理 class' __dict__
属性,这样信息就不会在酸洗过程中丢失。
这个想法是 Boost::Python 实际上无法确定代码是否正确编写,因此您需要跳过这个额外的障碍,这样,如果您没有意识到问题所在,您会看到错误消息 - 正如他们所说,to alert the user to this highly unobvious problem
.
它没有做任何神奇的事情。它只是为了确认您“阅读了保修”,可以这么说。
The boost/Python documentation for pickle support says this:
这只是解释为什么考虑 __dict__
内容很重要的原因 - 即使您不想腌制在 __init__
中明确设置的所有属性(例如,因为 class 包含对您打算以其他方式加载的大型资源的引用,或者结果缓存,或者...)。简而言之,您的 class 实例可能包含您不希望它们包含的信息,并且您的 __getstate__
实现 不知道如何处理,除非它采取实例的 __dict__
计入帐户.
因此提供了“实用建议”:“如果需要 __getstate__
,请将实例的 __dict__
包含在返回的 Python 对象中。”
What is this __dict__
referring to? Is it the __dict__
attribute of the derived class object?
它是 实例的 __dict__
属性,__getstate__
被调用 。如果 class 不覆盖方法,那可能是派生 class 的一个实例。或者它可能是基础 class 的一个实例,它可能在 class 实现之外添加了额外的属性,也可能没有。
Also, why does this dict needs to be handled explicitly if pickle calls init to create a new object and then sets the attribute?
见上文。当您 获取 属性(以便可以写入 pickle 文件)时,您需要确保您确实获取了所有必要的属性,否则它们将在恢复时丢失。硬编码逻辑可能会遗漏一些。
我一直在研究多处理和 C++ 扩展,但我不太了解 __getstate_manages_dict__
函数(我知道如何使用它,但我不太确定它是如何工作的)。 boost/Python documentation for pickle support 是这样说的:
The author of a Boost.Python extension class might provide a
__getstate__
method without considering the possibilities that: * his class is used in Python as a base class. Most likely the dict of instances of the derived class needs to be pickled in order to restore the instances correctly. * the user adds items to the instance's__dict__
directly. Again, the__dict__
of the instance then needs to be pickled.
To alert the user to this highly unobvious problem, a safety guard is provided. If
__getstate__
is defined and the instance's__dict__
is not empty, Boost.Python tests if the class has an attribute__getstate_manages_dict__
. An exception is raised if this attribute is not defined:
我见过一些示例,其中对象的 __dict__
在 __getstate__
中返回,然后在 __setstate__
中更新。 __dict__
指的是什么?它是派生的 class 对象的 __dict__
属性吗?另外,如果 pickle 调用 __init__
创建一个新对象然后设置属性,为什么需要显式处理这个字典?
谢谢
I know how to use it, but I'm not really sure how it works
这是一个布尔值,默认为 False。重点是向 Boost 发出信号,表明 __getstate__
/__setstate__
实现处理 class' __dict__
属性,这样信息就不会在酸洗过程中丢失。
这个想法是 Boost::Python 实际上无法确定代码是否正确编写,因此您需要跳过这个额外的障碍,这样,如果您没有意识到问题所在,您会看到错误消息 - 正如他们所说,to alert the user to this highly unobvious problem
.
它没有做任何神奇的事情。它只是为了确认您“阅读了保修”,可以这么说。
The boost/Python documentation for pickle support says this:
这只是解释为什么考虑 __dict__
内容很重要的原因 - 即使您不想腌制在 __init__
中明确设置的所有属性(例如,因为 class 包含对您打算以其他方式加载的大型资源的引用,或者结果缓存,或者...)。简而言之,您的 class 实例可能包含您不希望它们包含的信息,并且您的 __getstate__
实现 不知道如何处理,除非它采取实例的 __dict__
计入帐户.
因此提供了“实用建议”:“如果需要 __getstate__
,请将实例的 __dict__
包含在返回的 Python 对象中。”
What is this
__dict__
referring to? Is it the__dict__
attribute of the derived class object?
它是 实例的 __dict__
属性,__getstate__
被调用 。如果 class 不覆盖方法,那可能是派生 class 的一个实例。或者它可能是基础 class 的一个实例,它可能在 class 实现之外添加了额外的属性,也可能没有。
Also, why does this dict needs to be handled explicitly if pickle calls init to create a new object and then sets the attribute?
见上文。当您 获取 属性(以便可以写入 pickle 文件)时,您需要确保您确实获取了所有必要的属性,否则它们将在恢复时丢失。硬编码逻辑可能会遗漏一些。