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.

Controlando as versões das classes

Às vezes, precisamos fazer modificações em nossos objetos de Python que se

mostram totalmente incompatíveis com as versões anteriores desses objetos.

Quando é esse o caso, a técnica de usar argumentos com valores default deixa de

funcionar.

Por exemplo, digamos que num dado momento o desenvolvedor do jogo perceba

não fazer sentido ter um número limitado de vidas e queira remover o conceito

de vida. O exemplo de código a seguir redefine o objeto GameState para não

mais possuir o campo “lives”:

class GameState(object):

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

# ...

A partir desse momento, a desserialização de jogos salvos em versões anteriores

para de funcionar. Todos os campos dos dados antigos, mesmo os removidos da

classe, serão passados ao construtor GameState pela função

unpickle_game_state.

pickle.loads(serialized)

>>>

TypeError: __init__() got an unexpected keyword argument 'lives'

A solução é incluir nas funções repassadas a copyreg um parâmetro que indique

a versão. Os dados serializados na versão nova serão marcados como sendo da

versão 2, especificada sempre que um novo objeto GameState for criado.

def pickle_game_state(game_state):

kwargs = game_state.__dict__

kwargs['version'] = 2

return unpickle_game_state, (kwargs,)

Versões antigas não conterão o argumento version, permitindo que manipulemos

apropriadamente os argumentos passados ao construtor GameState.

def unpickle_game_state(kwargs):

version = kwargs.pop('version', 1)

if version == 1:

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!