15.12.2022 Views

Python Eficaz

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

GameState correspondente. Como podemos observar, não passa de uma pequena

função que apenas envolve o construtor.

def unpickle_game_state(kwargs):

return GameState(**kwargs)

Basta agora registrar essas funções com o módulo nativo copyreg.

copyreg.pickle(GameState, pickle_game_state)

A serialização e desserialização funcionam como antes:

state = GameState()

state.points += 1000

serialized = pickle.dumps(state)

state_after = pickle.loads(serialized)

print(state_after.__dict__)

>>>

{'lives': 4, 'level': 0, 'points': 1000}

Com o registro efetuado, podemos alterar a definição de GameState para dar ao

jogador uma contagem de feitiços que ele pode usar ao longo do jogo. Essa

mudança é semelhante à que fizemos quando adicionamos o campo points a

GameState.

class GameState(object):

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

# ...

Contudo, desta vez, ao desserializar um objeto GameState de uma versão antiga

do jogo, obtemos dados válidos em vez de atributos faltantes. Isso só funciona

porque unpickle_game_state chama o construtor GameState diretamente. Os

argumentos por palavra-chave do construtor têm valores default que são

adotados quando há parâmetros faltando. Com isso, arquivos de jogo salvo de

versões anteriores recebem o valor default em seu novo campo magic ao serem

desserializados.

state_after = pickle.loads(serialized)

print(state_after.__dict__)

>>>

{'level': 0, 'points': 1000, 'magic': 5, 'lives': 4}

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!