gpt4 book ai didi

python - 分段 pickle 对象与一次 pickle 对象之间的区别?

转载 作者:行者123 更新时间:2023-12-01 08:34:20 25 4
gpt4 key购买 nike

给定一个像这样的任意Pythonic对象:

class ExampleObj(object):
def __init__(self):
self.a = 'a'
self.b = 'b'
self.c = 'c'

obj = ExampleObj()

这两种序列化方法之间有功能差异吗?

分段 pickle

base = type(obj)
name = obj.__class__.__name__
pickled_data = {}

for key,val in obj.__dict__.items():
pickled_data[key] = pickle.dumps(val)

vars = {k : pickle.loads(v) for k,v in pickled_data.items()}
restored = type(name, (base,), vars)

标准 pickle

restored = pickle.loads( pickle.dumps(obj) )

我无法想象任何情况,但我担心可能有一些我没有考虑的边缘情况。

(在我的应用程序中,某些对象可能没有可序列化的变量。我们希望实现分段 pickle ,以便我们更好地识别哪些变量阻止我们 pickle 对象)

最佳答案

在第一种情况下,您将创建 type 的实例,而在第二种情况下,您将创建 ExampleObj 类型的实例。为了了解这两个结果在功能上有何不同,我将第一个示例的结果命名为 restored_1,将第二个示例的结果命名为 restored_2

type(restored_1)  # type
type(restored_2) # __main__.ExampleObj

因此,restored_1restored_2 在功能上不会等同于您提到的您正在寻找的功能。

作为一个简单的说明,向 ExampleObj 添加方法或属性,并尝试以各种方式使用任一过程中恢复的对象。

class ExampleObj(object):
def __init__(self):
self.a = 'a'
self.b = 'b'
self.c = 'c'

def foo(self):
print('bar')

@property
def baz(self):
print(self.a + self.b)

obj = ExampleObj()

执行第一个代码后,返回一个 type 的实例:

restored_1.foo()     # exception raised because restored_1 is not an ExampleObj instance
restored_1.bar # returns <property at 0x107863138> type
restored_1.__dict__ # returns a mappingproxy object

执行第二个代码后,该代码返回 ExampleObj 的实例:

restored_2.foo()     # bar
restored_2.bar # ab
restored_2.__dict__ # {'a': 'a', 'b': 'b', 'c': 'c'}

如果您正在寻找有关查看哪个实例 attrs pickle 失败的方法的讨论,请参阅此问题:How to tell for which object attribute pickle fails?

关于python - 分段 pickle 对象与一次 pickle 对象之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53798447/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com