copy_reg如何保存reduce/rebuild函数
How does copy_reg save the reduce/rebuild functions
假设我使用copy_reg.pickle
注册一个reduce函数,如下所示。
import copy_reg, copy, pickle
some_global_variable = 10
class C(object):
def __init__(self, a):
self.a = a
self.b = some_global_variable
def unpickle_c(a):
c = C(a)
c.b = some_global_variable
def pickle_c(c):
return unpickle_c, (c.a,)
copy_reg.pickle(C, pickle_c)
我有几个问题:
函数 unpickle_c
是否保存为序列化对象并调用 unpickling?如果这是真的,是否意味着我无法访问函数外部的状态,例如 unpickle_c
函数中的 some_global_variable
?或者全局变量是否也作为序列化函数对象的一部分保存?
如果上述情况不正确,unpickle_c
是否保存为某种标识符,并且函数只是定位并在 unpickling 时调用?如果这是真的,是否意味着,如果包含 unpickle_c
的模块在 unpickling 时尚未导入,它将被导入?
我刚刚通过自己试验 pickle 模块得到了答案。基本上,项目符号 2 是正确的。通过检查 pickled 字符串,保存了模块名称和重建函数的名称。该模块将在 unpickling 时导入,然后调用该模块的函数。
假设我使用copy_reg.pickle
注册一个reduce函数,如下所示。
import copy_reg, copy, pickle
some_global_variable = 10
class C(object):
def __init__(self, a):
self.a = a
self.b = some_global_variable
def unpickle_c(a):
c = C(a)
c.b = some_global_variable
def pickle_c(c):
return unpickle_c, (c.a,)
copy_reg.pickle(C, pickle_c)
我有几个问题:
函数
unpickle_c
是否保存为序列化对象并调用 unpickling?如果这是真的,是否意味着我无法访问函数外部的状态,例如unpickle_c
函数中的some_global_variable
?或者全局变量是否也作为序列化函数对象的一部分保存?如果上述情况不正确,
unpickle_c
是否保存为某种标识符,并且函数只是定位并在 unpickling 时调用?如果这是真的,是否意味着,如果包含unpickle_c
的模块在 unpickling 时尚未导入,它将被导入?
我刚刚通过自己试验 pickle 模块得到了答案。基本上,项目符号 2 是正确的。通过检查 pickled 字符串,保存了模块名称和重建函数的名称。该模块将在 unpickling 时导入,然后调用该模块的函数。