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.

kwargs.pop('lives')

return GameState(**kwargs)

Agora, a desserialização de um objeto antigo funcionará corretamente.

copyreg.pickle(GameState, pickle_game_state)

state_after = pickle.loads(serialized)

print(state_after.__dict__)

>>>

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

Podemos continuar usando essa técnica para lidar com quaisquer mudanças que

ocorram em implementações futuras da mesma classe. Qualquer lógica

necessária para adaptar uma versão antiga da classe para um novo modelo pode

ser direcionada para a função unpickle_game_state.

Caminhos estáveis de importação

Outro problema com que podemos nos deparar ao empregar pickle é o programa

deixar de funcionar quando renomeamos uma classe. É muito frequente, durante

o tempo de vida do programa, refatorarmos o código, ou seja, renomear classes e

transferi-las de um módulo para outro. Infelizmente, isso acaba por confundir o

módulo pickle e fazer com que ele deixe de funcionar, a não ser que sejamos

cuidadosos.

No exemplo de código a seguir, renomeamos a classe GameState para

BetterGameState, removendo completamente do programa a classe antiga:

class BetterGameState(object):

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

# ...

Desserializar um antigo objeto GameState falhará, porque a classe não existe

mais:

pickle.loads(serialized)

>>>

AttributeError: Can't get attribute 'GameState' on <module

➥'__main__' from 'my_code.py'>

A causa dessa exceção é simples: o caminho de importação do objeto serializado

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!