Supponendo che sia necessario supportare solo Python 2.6 e successivi, è possibile utilizzare semplicemente bytes
per, beh, byte. Utilizzare i valori letterali b
per creare oggetti byte, ad esempio b'\x0a\x0b\x00'
. Quando si lavora con i file, assicurarsi che la modalità includa un b
(come in open('file.bin', 'rb')
).
Attenzione però che l'iterazione e l'accesso agli elementi sono diversi. In questi casi, puoi scrivere il tuo codice per utilizzare i blocchi. Invece di b[0] == 0
(Python 3) o b[0] == b'\x00'
(Python 2) scrivere b[0:1] == b'\x00'
. Altre opzioni utilizzano bytearray
(quando i byte sono modificabili) o le funzioni di supporto.
Le stringhe di caratteri devono essere unicode
in Python 2, indipendenti dal porting di Python 3; altrimenti il codice sarebbe probabilmente sbagliato quando si incontrano comunque caratteri non ASCII. L'equivalente è str
in Python 3.
Utilizzare i valori letterali u
per creare stringhe di caratteri (come u'Düsseldorf'
) e/o assicurarsi di avviare ogni file con from __future__ import unicode_literals
. Dichiarare le codifiche dei file quando necessario avviando i file con # encoding: utf-8
.
Utilizzare io.open
per leggere le stringhe di caratteri dai file. Per il codice di rete, recuperare i byte e chiamare decode
su di essi per ottenere una stringa di caratteri.
Se è necessario supportare Python 2.5 o 3.2, dai un'occhiata a six per convertire i letterali.
Aggiungi molte asserzioni per assicurarti che le funzioni che operano sulle stringhe di caratteri non ottengano i byte e viceversa. Come al solito, una buona suite di test con copertura del 100% aiuta molto.
Perché non limitarsi a 'str'? È lo stesso tra le versioni, giusto? – zondo
@zondo: no, non lo sono. 'str' in Python 3 è più o meno come' unicode' in 2. Non puoi andare a memorizzare i dati binari grezzi in 'str' in Python 3. –
Usa il prefisso' b '..' 'in entrambi per definire letterali, e usa una libreria bridge come 'six' per gestire il resto dei casi. –