Velocity Reviews - Computer Hardware Reviews

Velocity Reviews > Newsgroups > Programming > Python > Pickling object inherited from dict

Reply
Thread Tools

Pickling object inherited from dict

 
 
Thomas Guettler
Guest
Posts: n/a
 
      10-27-2003
Hi!

If I pickle a class which inherits from dict,
I don't get the same data again, if I unpickle
it.

def test_pickle():
home="..."
server=WorkflowServer(home)
server.save()
print server.users.items() # 1
unpickle=load(home)
print unpickle.users.items() #2

def load(home):
file=os.path.join(home, "data.pickle")
fd=open(file)
server=pickle.load(fd)
fd.close()
assert(server.__class__==WorkflowServer)
return server

WorkflowServer:
def save(self):
file=os.path.join(self.home, "data.pickle")
fd=open(file, "w")
pickle.dump(self, fd)
fd.close()

class User(dict):
....

class UserManagemente(dict):
.... # server.users

If I run test_pickle() I get this result: (See #1 and #2)
[('EGSADMIN', {}), ('TEST', {})]
[('EGSADMIN', {}), ('TEST', (<class '__main__.UserManagement'>,
<type 'dict'>, {'EGSADMIN': {}, 'TEST': {}}))]

Why are the two lines different? Sorry, I was not able
to make a smaller working example today.

thomas


Python 2.2.2


 
Reply With Quote
 
 
 
 
Thomas Guettler
Guest
Posts: n/a
 
      10-28-2003
Am Mon, 27 Oct 2003 17:19:08 +0100 schrieb Thomas Guettler:

> Hi!
>
> If I pickle a class which inherits from dict,
> I don't get the same data again, if I unpickle
> it.


Here is a executable example:
import pickle

class MyDictContainer(dict):
def __init__(self):
dict.__init__(self)
print "MyDictContainer.__init__"

class MyDict(dict):
def __init__(self, root, name):
dict.__init__(self)
self.root=root
self.name=name

container=MyDictContainer()
for name in ["one", "two", "three"]:
mydict=MyDict(container, name)
container[name]=mydict

print container
file="data.pickle"
fd=open(file, "w")
pickle.dump(container, fd)
fd.close()

fd=open(file)
unpickle=pickle.load(fd)
fd.close()
print unpickle


Output:

===> python test-pickle.py
MyDictContainer.__init__
{'three': {}, 'two': {}, 'one': {}}
{'one': {},
'three': (<class '__main__.MyDictContainer'>,
<type 'dict'>, {'three': {},
'two': (<class '__main__.MyDictContainer'>, <type 'dict'>,
{'three': {}, 'two': {}, 'one': {}}), 'one': {}}), 'two':
(<class '__main__.MyDictContainer'>, <type 'dict'>,
{'three': {}, 'two': {}, 'one': {}})}

After unpickling the object is not the same anymore.
Any hints?

thomas

 
Reply With Quote
 
 
 
Reply

Thread Tools

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is On
HTML code is Off
Trackbacks are On
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
pickling a circular object inherited from list Klaus Kopec Python 4 12-10-2008 10:03 AM
Pickling and unpickling inherited attributes Alex Python 9 11-02-2005 02:59 AM
[OT] nntp references, was re: pickling a dict Dan Perl Python 0 11-03-2004 12:25 PM
pickling subclasses of dict/list Edward Loper Python 1 07-04-2004 03:28 PM
Pickling Objects inherited from dict (Bug?) Thomas Guettler Python 1 11-05-2003 01:31 PM



Advertisments