gpt4 book ai didi

python - Pickling 相互引用的对象

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

我有三个 Python 类,Student , Event ,和StudentEvent .

为了简单起见:

class Student:
def __init__(self, id):
self.id = id

class Event:
def __init__(self, id):
self.id = id
self.studentevents = []

class StudentEvent:
def __init__(self, student, event, id):
self.student = student
self.event = event
self.id = id

每个类都有成千上万个实例,我将它们放入可以阅读和分析的字典中。读取和创建对象需要花费大量时间,因此我想将它们放入 3 个字典中,students_dict , events_dict , studentevents_dict .

所以,好吧,我可以做到。但是,如果我稍后取消字典的pickle,studentevents_dict中的学生和事件不会引用相同的StudentsEventsstudents_dictevents_dict ,正确吗?

如果我稍后修改对象,例如填充关联的 StudentEvents 的列表在 Event对象,这可能会出现问题,因为 StudentEvent 引用的事件不会是Eventevents_dict 中具有相同的 id .

最佳答案

正确。例如,如果需要保留对象之间的指针关系,则必须将它们一起 pickle 在元组中。这里我使用的是dill而不是pickle,但是效果应该是一样的。这适用于类实例(如图所示)、字典或其他。

>>> class A:
... def __init__(self, b):
... self.b = b
...
>>> class B:
... pass
...
>>> import dill
>>>
>>> b = B()
>>> a = A(b)
>>>
>>> f = open('_sed', 'wb')
>>> dill.dump(({1:a},{2:b}), f)
>>> f.close()

然后……

Python 2.7.8 (default, Jul 13 2014, 02:29:54) 
[GCC 4.2.1 Compatible Apple Clang 4.1 ((tags/Apple/clang-421.11.66))] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import dill
>>> f = open('_sed', 'rb')
>>> t = dill.load(f)
>>> f.close()
>>> t
({1: <__main__.A instance at 0x10906a440>}, {2: <__main__.B instance at 0x10906a830>})
>>> t[0][1].b
<__main__.B instance at 0x10906a830>

关于python - Pickling 相互引用的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26166678/

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