Pickling object inherited from dict

Discussion in 'Python' started by Thomas Guettler, Oct 27, 2003.

  1. 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
     
    Thomas Guettler, Oct 27, 2003
    #1
    1. Advertising

  2. 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
     
    Thomas Guettler, Oct 28, 2003
    #2
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Thomas Guettler

    Pickling Objects inherited from dict (Bug?)

    Thomas Guettler, Nov 5, 2003, in forum: Python
    Replies:
    1
    Views:
    300
    Michael Hudson
    Nov 5, 2003
  2. Edward Loper

    pickling subclasses of dict/list

    Edward Loper, Jul 3, 2004, in forum: Python
    Replies:
    1
    Views:
    404
    Greg Chapman
    Jul 4, 2004
  3. Dan Perl
    Replies:
    0
    Views:
    359
    Dan Perl
    Nov 3, 2004
  4. Alex
    Replies:
    9
    Views:
    375
  5. Klaus Kopec
    Replies:
    4
    Views:
    459
    Klaus Kopec
    Dec 10, 2008
Loading...

Share This Page