[python] pickle

Martin Blazik martin.blazik na premiumsms.cz
Středa Březen 29 10:24:47 CEST 2006


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



Další informace o konferenci Python