2012-01-22 2 views
1

Как я могу сериализовать хеш-объекты ?, Я использую shelve для хранения множества объектов.Как сериализовать хэш-объекты в Python

Иерархия:

- user 
    - client 
    - friend 

user.py:

import time 
import hashlib 
from localfile import localfile 

class user(object): 
    _id = 0 
    _ip = "127.0.0.1" 
    _nick = "Unnamed" 
    _files = {} 
    def __init__(self, ip="127.0.0.1", nick="Unnamed"): 
     self._id = hashlib.sha1(str(time.time())) 
     self._ip = ip 
     self._nick = nick 
    def add_file(self, localfile): 
     self._files[localfile.hash] = localfile 
    def delete_file(self, localfile): 
     del self._files[localfile.hash] 

if __name__ == "__main__": 
    pass 

client.py:

from user import user 
from friend import friend 

class client(user): 
    _friends = [] 
    def __init__(self, ip="127.0.0.1", nick="Unnamed"): 
     user.__init__(self, ip, nick) 
    @property 
    def friends(self): 
     return self._friends 
    @friends.setter 
    def friends(self, value): 
     self._friends = value 
    def add_friend(self, client): 
     self._friends.append(client) 
    def delete_friend(self, client): 
     self._friends.remove(client) 

if __name__ == "__main__": 
    import shelve 

    x = shelve.open("localfile", 'c') 

    cliente = client() 
    cliente.add_friend(friend("127.0.0.1", "Amigo1")) 
    cliente.add_friend(friend("127.0.0.1", "Amigo2")) 

    x["client"] = cliente 
    print x["client"].friends 

    x.close() 

Ошибки:

[email protected]:~/Documentos/workspace/test$ python client.py 
Traceback (most recent call last): 
    File "client.py", line 28, in <module> 
    x["client"] = cliente 
    File "/usr/lib/python2.7/shelve.py", line 132, in __setitem__ 
    p.dump(value) 
    File "/usr/lib/python2.7/copy_reg.py", line 70, in _reduce_ex 
    raise TypeError, "can't pickle %s objects" % base.__name__ 
TypeError: can't pickle HASH objects 

EDITED

Added user.py.

+0

Не каждый модуль нуждается в блоке 'if __name__ == '__main __', он бесполезен в user.py – Gandaro

+0

Вы правы, пользователь должен быть абстрактным классом. – Facon

ответ

4

Поскольку вы не можете сериализовать HASH объекты с shelve, вам придется предоставить такую ​​же информацию по-другому. Например, вы можете сохранить только дайджест хэша.

+0

Мне нужны обе вещи, ключи (строки) и элементы (объекты, которые можно мариновать). Я думаю, вставляя оба элемента в 2 списка, один для ключей, а другой для элементов. Но я не знаю, смогу ли я позже присоединиться к спискам правильно. – Facon

+0

Затем используйте словарь или список кортежей с 2 ​​элементами. – Gandaro

+0

Omg !, Я дурак, мне нужно только изменить это, как вы сказали: self._id = hashlib.sha1 (str (time.time())) to self._id = hashlib.sha1 (str. time())). hexdigest(), тогда объект может быть маринован. Я думал, что хэш уже был ниткой. Благодаря!!!! – Facon

0

Что-то в cliente, экземпляр client класс, не подбирается. Вот list of those types which are picklable.

Код, который вы опубликовали, не показывает, что содержит cliente, который не является сорбируемым. Но вы можете решить проблему, удалив неприличный атрибут, если он не нужен, или определив __getstate__ и __setstate, чтобы сделать client picklable.

+0

Я отправил класс, который наследует от клиента, который, вероятно, содержит этот элемент «хэш», пользователь, теперь, пожалуйста, проверьте. Я также принимаю любую критику, чтобы улучшить свой код. – Facon

Смежные вопросы