[python] pickle

Martin Blazik martin.blazik na premiumsms.cz
Středa Březen 29 16:01:12 CEST 2006


Jeste teda jeden dotaz :)
Ma nekdo zkusenosti se serializaci a new style class obecne? Na rozdil 
od stareho typu trid mi nechodi pomerne dost veci a nemuzu najit na 
inetu krome hromady nic nerikajici dokumentace zadne konkretni priklady. 
Elaboruju s __reduce__(), __getnewargs__(), __setstate__() i 
__getstate()__, ale neprinasi to kyzene vysledky. Uplne nejlepsi by byl 
fungujici prikladek serializace tridy odvozene od object. Za vsechny 
pripominky budu vdecny.

lachtan

Martin Blazik napsal(a):

>Cusik,
>nesetkal se nahodou jiz nekdo se serializaci instance ve ktere mam 
>atributy, ktere ukazuji na staticke metody tridy? Nedari se mi to 
>serializovat. Tady konkretne to muzu obejit, ze metodu noconv udelam 
>nestatickou, ale mam i jina mista, kde to nelze.
>Ukazka kde to nechodi:
>
>class TypeDict(dict):
>    """ Slovnik, ktery je schopny kontrolovat typ vkladanych dat """
>   
>    def __init__(self, strict = False):
>        """ strict - urcuje chovani pri pouziti neregistrovaneho klice
>        True - lze pouzivat jen registrovane klice
>        False - konverzni funkce se zalozi automaticky jako TypeDict.noconv
>        """
>        super(TypeDict, self).__init__()
>        self.__convert = {}
>        self.__strict = bool(strict)
>   
>    def setkey(self, key, convert):
>        self.__convert[key] = convert
>        if key in self:
>            TypeDict.__setitem__(self, key, self[key])
>   
>    @staticmethod
>    def noconv(value):
>        return value
>      
>    def __setitem__(self, key, value):
>        if key not in self.__convert:
>            if self.__strict:
>                raise KeyError(key)
>            else:
>                self.setkey(key, TypeDict.noconv)
>        super(TypeDict, self).__setitem__(key, self.__convert[key](value))
>
>
>import pickle
>dct = TypeDict()
>dct['key'] = 'netusim'
># ted je pro 'key' nastavena konverzni funkce TypeDict.noconv
>pickle.dumps(dct)
>....
>pickle.PicklingError: Can't pickle <function noconv at 0x402f42cc>: it's 
>not found as typedict.noconv
># navic ji ocividne hleda na jinem miste nebot aboslutni umisteni je 
>typedict.TypeDict.noconv
>
>lachtan
>
>_______________________________________________
>Python mailing list
>Python na py.cz
>http://www.py.cz/mailman/listinfo/python
>
>  
>


Další informace o konferenci Python