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__
.