Méthodes de test pour personnaliser le comportement de Pickle

pickle est une bibliothèque standard pour sérialiser des objets Python en octets pour le stockage dans des fichiers et autres. Les objets sélectionnables sont sélectionnables et la régénération d'un objet à partir d'une chaîne d'octets sérialisée s'appelle Unpickle.

Pickle tente de sérialiser les attributs des objets enregistrés dans __dict__ par défaut, mais vous pouvez personnaliser son comportement en définissant une méthode spéciale pour pickle. En particulier, il est utilisé lorsque l'objet à décaper a un objet qui ne peut pas être décapé en tant que membre, ou lorsque l'objet est créé par un constructeur qui prend un argument.

Méthode Utilisation conforme
__getnewargs__() Spécifiez l'argument à transmettre au constructeur lors de la désélection.
__getstate__() __dict__Au lieu de cela, choisissez l'objet retourné par cette méthode.
__setstate__(state) Reçoit l'objet mariné en tant qu'état et effectue le traitement au moment du décapage.

Le code suivant est un exemple de script pour voir le comportement de ces méthodes.

python


import pickle

class Foo:
    def __new__(self, a):
        print('in __new__:', a)
        self = object.__new__(self)
        # self.a = a
        return self
    
    def __init__(self, a):
        print('in __init__:', a)
        self.a = a

    def __getstate__(self):
        print('in __getstate__:', self.a)
        state = self.__dict__.copy()
        return state

    def __getnewargs__(self):
        print('in __getnewargs__:', self.a)
        return (2 * self.a,)

    def __setstate__(self, state):
        self.__dict__.update(state)
        print('in __setstate__:', self.a)


foo = Foo(3)
bar = pickle.dumps(foo)
baz = pickle.loads(bar)
print(baz.__dict__)

Le résultat de l'exécution de ce script est le suivant.

python


in __new__: 3
in __init__: 3
in __getnewargs__: 3
in __getstate__: 3
in __new__: 6
in __setstate__: 3
{'a': 3}

Comme indiqué dans le manuel de cornichon, vous pouvez voir ce qui suit.

--__getnewargs__ est appelé lors du décapage. En d'autres termes, les informations de l'argument passé à __new__ lorsqu'il est décoché sont picklées.

Recommended Posts

Méthodes de test pour personnaliser le comportement de Pickle
Automatisation des tests pour le travail
Test d'hypothèse pour l'amélioration du produit
Pour se préparer au test G 2020 # 2
Code de test pour évaluer les décorateurs
Modèle Python pour Codeforces-test manuel-