loads exceptions example datacamp and python pickle

exceptions - python pickle dump and load



Excluir campo de objeto de decapado en python (3)

Me gustaría evitar el decapado de ciertos campos en una instancia de una clase. Actualmente, antes de decapar, simplemente configuro esos campos como Ninguno, pero me pregunto si hay una solución más elegante.


Pickling utiliza los métodos __getstate__ y __setstate__ del objeto; puede anularlos e ignorar los campos que desee.

# foo.py class Foo: def __init__(self): self.bar = 1 self.baz = 2 def __getstate__(self): state = self.__dict__.copy() # Don''t pickle baz del state["baz"] return state def __setstate__(self, state): self.__dict__.update(state) # Add baz back since it doesn''t exist in the pickle self.baz = 0

# main.py import pickle from foo import Foo foo = Foo() print(f"Foo bar: {foo.bar} baz: {foo.baz}") new_foo = pickle.loads(pickle.dumps(foo)) print(f"New bar: {new_foo.bar} baz: {new_foo.baz}")

Salida:

Foo bar: 1 baz: 2 New bar: 1 baz: 0

Puede encontrar otro ejemplo aquí: https://docs.python.org/3/library/pickle.html#handling-stateful-objects


Una forma de manejar los atributos de instancia que no son objetos seleccionables es usar los métodos especiales disponibles para modificar el estado de una instancia de clase: getstate () y setstate (). Aquí hay un ejemplo

class Foo(object): def __init__(self, value, filename): self.value = value self.logfile = file(filename, ''w'') def __getstate__(self): """Return state values to be pickled.""" f = self.logfile return (self.value, f.name, f.tell()) def __setstate__(self, state): """Restore state from the unpickled state values.""" self.value, name, position = state f = file(name, ''w'') f.seek(position) self.logfile = f

Cuando una instancia de Foo es decapada, Python solo decapara los valores que se le devuelven cuando llama al método getstate () de la instancia. Del mismo modo, durante la descifrado, Python proporcionará los valores no seleccionados como un argumento al método setstate () de la instancia. Dentro del método setstate () podemos recrear el objeto de archivo en función del nombre y la información de posición que seleccionamos, y asignar el objeto de archivo al atributo de archivo de registro de la instancia.

Referencia: http://www.ibm.com/developerworks/library/l-pypers.html


Aquí hay un ejemplo que resuelve su problema con __getstate__ y __setstate__ .