15.12.2022 Views

Python Eficaz

You also want an ePaper? Increase the reach of your titles

YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.

objeto devolvido é uma instância da nova versão da classe GameState.

assert isinstance(state_after, GameState)

Esse comportamento é um subproduto da maneira com que o módulo pickle

funciona. Seu principal uso é facilitar a serialização de objetos. No momento em

que seu uso de pickle começa a fugir dos usos mais triviais, a funcionalidade do

módulo começa a se esfacelar e apresentar comportamentos surpreendentes.

A maneira mais simples e direta de sanar esses problemas é pelo módulo nativo

copyreg. O módulo copyreg permite registrar as funções responsáveis pela

serialização dos objetos do Python, permitindo o controle do comportamento de

pickle e, assim, tornando-o mais confiável.

Valores default dos atributos

No caso mais simples, podemos usar um construtor com argumentos default

(consulte o Item 19: “Implemente comportamento opcional usando palavraschave

como argumentos”) para garantir que os objetos de GameState sempre

tenham todos os atributos preenchidos depois de descompactados com o pickle.

O exemplo de código a seguir redefine o construtor para que funcione dessa

maneira:

class GameState(object):

def __init__(self, level=0, lives=4, points=0):

self.level = level

self.lives = lives

self.points = points

Para usar esse construtor com o pickle, definimos uma função auxiliar que

recebe um objeto GameState e o converte em uma tupla de parâmetros para o

módulo copyreg. A tupla resultante contém a função usada para o

desempacotamento com pickle e os parâmetros a serem passados para a função

de “despicklização”.

def pickle_game_state(game_state):

kwargs = game_state.__dict__

return unpickle_game_state, (kwargs,)

Agora, precisamos definir a função auxiliar unpickle_game_state. Essa função

recebe parâmetros e dados serializados de pickle_game_state e devolve o objeto

www.full-ebook.com

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!