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.

O problema com essa técnica é o que acontece à medida que mais recursos vão

sendo adicionados a cada nova versão do jogo. Imagine um novo recurso no qual

o jogador possa ir acumulando pontos para figurar num ranking e evidenciar o

resultado mais alto (high score). Para acompanhar os pontos do jogador, é

preciso adicionar um novo campo na classe GameState.

class GameState(object):

def __init__(self):

# ...

self.points = 0

Serializar a nova versão de GameState usando pickle funcionaria como antes,

sem problemas. No exemplo de código a seguir, simulamos o caminho de ida e

volta: serializamos um objeto em uma string usando dumps, gravamos no

arquivo, lemos a string do arquivo e a convertemos em objeto novamente com

loads:

state = GameState()

serialized = pickle.dumps(state)

state_after = pickle.loads(serialized)

print(state_after.__dict__)

>>>

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

Funciona, mas o que aconteceria se quiséssemos abrir objetos GameState mais

antigos, de versões anteriores do jogo, salvos em outros arquivos? É justo

imaginar que o jogador queira voltar a esses jogos salvos também. No exemplo

de código a seguir, se tentarmos desserializar (com pickle) um jogo salvo em

uma versão anterior usando uma versão mais nova, com a nova definição da

classe GameState:

with open(state_path, 'rb') as f:

state_after = pickle.load(f)

print(state_after.__dict__)

>>>

{'lives': 3, 'level': 1}

O atributo points não foi encontrado! Isso acaba gerando confusão porque o

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!