Cosa significa il prefisso ab prima di una stringa Python?


107

In un codice sorgente Python in cui mi sono imbattuto ho visto una piccola b prima di una stringa come in:

b"abcdef"

Conosco il uprefisso che indica una stringa Unicode e il rprefisso per una stringa letterale non elaborata.

Che cosa significa be in che tipo di codice sorgente è utile in quanto sembra essere esattamente come una semplice stringa senza prefisso?


10
@SLott: segui il link che hai fornito vedrai che il prefisso b non è consentito nel prefisso stringa ... per 2.6 (sembra un errore minore nel materiale di riferimento). E cercare su Google questo tipo di cose non è facile. Ho provato parole chiave come "b prefisso stringa python" e praticamente non sono arrivato da nessuna parte.
kriss

Nel collegamento utilizzato da S.Lott manca un identificatore di versione; si tratta di Python 3: docs.python.org/3/reference/… . Il prefisso è ora supportato anche in Python 2.6 e versioni successive per facilitare il codice Python cross-version.
Martijn Pieters

1
questa domanda non è né "un duplicato esatto" né una risposta alla domanda "Posso eliminare questo carattere 'b' nella mia dichiarazione di stampa?" stackoverflow.com/questions/42599851/... Ti dispiacerebbe deselezionando che Marijin per favore? la persona che ha chiesto così come la persona che ha effettivamente tentato una risposta potrebbe apprezzare la possibilità di avere una risposta alla domanda posta.
me_

Risposte:


62

Questo è bytes letterale Python3 . Questo prefisso è assente in Python 2.5 e versioni precedenti (è equivalente a una semplice stringa di 2.x, mentre la semplice stringa di 3.x è equivalente a un letterale con uprefisso in 2.x). In Python 2.6 + è equivalente a una stringa piana, per la compatibilità con 3.x .


@WRAR: era nel codice python 2.6 l'ho visto, sembra che sia stato introdotto in python2.6
kriss

L'ho controllato specificatamente nel riferimento 2.6 prima di pubblicare: docs.python.org/reference/lexical_analysis.html#literals
wRAR

1
OK, "Per compatibilità futura, Python 2.6 aggiunge byte come sinonimo per il tipo str, e supporta anche la notazione b ''.", Da "Novità".
wRAR

poiché i collegamenti sopra ora puntano al riferimento 2.7 ed è stato aggiunto il prefisso b, ecco un collegamento al vecchio riferimento fasullo docs.python.org/release/2.6.8/reference/…
kriss

98

Il bprefisso indica una bytesstringa letterale .

Se lo vedi usato nel codice sorgente di Python 3, l'espressione crea un bytesoggetto , non un normale oggetto Unicodestr . Se lo vedi echeggiare nella tua shell Python o come parte di un elenco, dict o altri contenuti del contenitore, allora vedi un bytesoggetto rappresentato usando questa notazione.

bytesgli oggetti fondamentalmente contengono una sequenza di numeri interi nell'intervallo 0-255, ma quando rappresentati, Python visualizza questi byte come punti di codice ASCII per facilitare la lettura del loro contenuto. I byte di fuori della stampabile gamma di caratteri ASCII vengono mostrati come sequenze di escape (ad esempio \n, \x82ecc). Al contrario, è possibile utilizzare sia caratteri ASCII che sequenze di escape per definire i valori dei byte; per i valori ASCII viene utilizzato il loro valore numerico (es b'A'== b'\x41')

Poiché un bytesoggetto è costituito da una sequenza di numeri interi, puoi costruire un bytesoggetto da qualsiasi altra sequenza di numeri interi con valori compresi tra 0 e 255, come un elenco:

bytes([72, 101, 108, 108, 111])

e l'indicizzazione ti restituisce i numeri interi (ma l'affettatura produce un nuovo bytesvalore; per l'esempio sopra, value[0]ti dà 72, ma value[:1]è b'H'come 72 è il punto di codice ASCII per la lettera maiuscola H ).

bytesmodellare i dati binari , compreso il testo codificato . Se il tuo bytesvalore contiene testo, devi prima decodificarlo, utilizzando il codec corretto. Se i dati sono codificati come UTF-8, ad esempio, puoi ottenere un strvalore Unicode con:

strvalue = bytesvalue.decode('utf-8')

Al contrario, per passare dal testo in un stroggetto a bytesè necessario codificare . Devi decidere una codifica da utilizzare; l'impostazione predefinita è utilizzare UTF-8, ma ciò di cui avrai bisogno dipende in gran parte dal tuo caso d'uso:

bytesvalue = strvalue.encode('utf-8')

Puoi anche usare il costruttore, bytes(strvalue, encoding)per fare lo stesso.

Entrambi i metodi di decodifica e codifica richiedono un argomento aggiuntivo per specificare come devono essere gestiti gli errori .

Python 2, le versioni 2.6 e 2.7 supportano anche la creazione di stringhe letterali usando b'..'la sintassi di string literal, per semplificare il codice che funziona sia su Python 2 che su 3.

bytesgli oggetti sono immutabili, proprio come le strstringhe. Usa un bytearray()oggetto se devi avere un valore di byte modificabili.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.