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.

unicode a uma função que espera apenas uma delas e tudo vai funcionar – desde

que estejamos lidando apenas com caracteres ASCII de 7 bits. No Python 3, as

instâncias bytes e str jamais serão equivalentes – nem mesmo a string vazia –

portanto, é preciso ser cauteloso a respeito dos tipos de caracteres e strings sendo

passados adiante.

O primeiro problema é que, em Python 3, as operações envolvendo “handlers”,

os manipuladores de arquivos (devolvidos pela função nativa open), sempre

esperam codificação UTF-8 por default. No Python 2, o default para as

operações de arquivo é sempre o tipo binário. Isso causa falhas inesperadas,

especialmente para os programadores acostumados com o Python 2.

Por exemplo, imaginemos que se queira escrever algum dado aleatório, de

formato binário, em um arquivo. Em Python 2, o código a seguir funciona. Em

Python 3, causa erro.

with open('/tmp/random.bin', 'w') as f:

f.write(os.urandom(10))

>>>

TypeError: must be str, not bytes

A causa dessa exceção é o novo argumento encoding para a função open,

adicionado no Python 3. Esse parâmetro tem como valor default 'utf-8'. Com

isso, as operações read e write em manipuladores de arquivos esperam receber

instâncias str contendo caracteres Unicode em vez de instâncias bytes contendo

dados binários.

Para que isso funcione de forma apropriada, é preciso indicar que o arquivo será

aberto em modo de escrita binária ('wb') em vez do modo de escrita de texto

('w'). O trecho de código a seguir emprega a função open de uma maneira que

funciona tanto em Python 2 como em Python 3:

with open('/tmp/random.bin', 'wb') as f:

f.write(os.urandom(10))

Esse problema também existe para a leitura de dados em arquivos. A solução é a

mesma: deixar expressa a indicação de leitura binária 'rb' em vez de 'r' ao abrir o

arquivo.

Lembre-se

www.full-ebook.com

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

Saved successfully!

Ooh no, something went wrong!