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.

está codificado nos dados anteriormente serializados pelo pickle:

print(serialized[:25])

>>>

b'\x80\x03c__main__\nGameState\nq\x00)'

A solução é, novamente, usar copyreg. Podemos especificar um identificador

estável para a função empregar no momento de desserializar um objeto,

permitindo converter dados serializados de uma classe para outras classes com

nomes diferentes. A técnica nos dá um certo grau de liberdade para usar vias

indiretas.

copyreg.pickle(BetterGameState, pickle_game_state)

Depois do copyreg, é fácil notar que o caminho de importação de

pickle_game_state está codificado nos dados serializados em vez de

BetterGameState.

state = BetterGameState()

serialized = pickle.dumps(state)

print(serialized[:35])

>>>

b'\x80\x03c__main__\nunpickle_game_state\nq\x00}'

A única pegadinha é que não podemos alterar o caminho do módulo no qual a

função unpickle_game_state estiver implementada. Uma vez que os dados sejam

serializados com uma função, esta deve estar eternamente disponível naquele

caminho de importação para possibilitar a desserialização desses dados no

futuro.

Lembre-se

• O módulo nativo pickle é útil apenas para serializar e desserializar objetos

entre programas confiáveis.

• O módulo pickle pode deixar de funcionar quando usado em casos mais

complexos que o trivial.

• Use o módulo nativo copyreg em conjunto com o pickle para incluir valores

default a atributos faltantes, permitir o controle de versão das classes e

garantir caminhos de importação estáveis.

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!