Apparemment, ce qui suit est la syntaxe valide:
my_string = b'The string'
J'aimerais savoir:
- Que signifie ce
b
caractère devant la chaîne? - Quels sont les effets de son utilisation?
- Quelles sont les situations appropriées pour l'utiliser?
J'ai trouvé une question connexe ici sur SO, mais cette question concerne PHP, et elle indique que le b
est utilisé pour indiquer que la chaîne est binaire, par opposition à Unicode, qui était nécessaire pour que le code soit compatible avec la version de PHP <6 , lors de la migration vers PHP 6. Je ne pense pas que cela s'applique à Python.
J'ai trouvé cette documentation sur le site Python sur l'utilisation d'un u
caractère dans la même syntaxe pour spécifier une chaîne comme Unicode. Malheureusement, il ne mentionne le caractère b nulle part dans ce document.
Aussi, juste par curiosité, y a-t-il plus de symboles que le b
et u
qui font autre chose?
unicode_literals
depuis__future__
, cela "inversera" le comportement de cette chaîne particulière (en Python 2.x)Python 3.x fait une distinction claire entre les types:
str
='...'
littéraux = une séquence de caractères Unicode (UTF-16 ou UTF-32, selon la façon dont Python a été compilé)bytes
=b'...'
littéraux = une séquence d'octets (entiers compris entre 0 et 255)Si vous êtes familier avec Java ou C #, pensez au
str
furString
et àbytes
mesurebyte[]
. Si vous connaissez SQL, pensez àstr
asNVARCHAR
etbytes
asBINARY
ouBLOB
. Si vous êtes familier avec le registre Windows, pensez austr
furREG_SZ
et àbytes
mesureREG_BINARY
. Si vous êtes familier avec C (++), oubliez tout ce que vous avez apprischar
et les chaînes, car UN PERSONNAGE N'EST PAS UN OCTET . Cette idée est depuis longtemps obsolète.Vous utilisez
str
lorsque vous souhaitez représenter du texte.Vous utilisez
bytes
lorsque vous souhaitez représenter des données binaires de bas niveau comme des structures.Vous pouvez encoder un
str
en unbytes
objet.Et vous pouvez décoder un
bytes
en unstr
.Mais vous ne pouvez pas mélanger librement les deux types.
La
b'...'
notation est quelque peu déroutante en ce qu'elle permet de spécifier les octets 0x01-0x7F avec des caractères ASCII au lieu de nombres hexadécimaux.Mais je dois souligner qu'un caractère n'est pas un octet .
En Python 2.x
Les versions pré-3.0 de Python n'avaient pas ce genre de distinction entre le texte et les données binaires. Au lieu de cela, il y avait:
unicode
=u'...'
littéraux = séquence de caractères Unicode = 3.xstr
str
='...'
littéraux = séquences d'octets / caractères confondusstruct.pack
sortie.Afin de faciliter la transition de 2.x vers 3.x, la
b'...'
syntaxe littérale a été rétroportée vers Python 2.6, afin de permettre de distinguer les chaînes binaires (qui devraient êtrebytes
en 3.x) des chaînes de texte (qui devraient êtrestr
en 3 .X). Leb
préfixe ne fait rien dans 2.x, mais indique au2to3
script de ne pas le convertir en chaîne Unicode dans 3.x.Alors oui, les
b'...'
littéraux en Python ont le même objectif qu'en PHP.Le
r
préfixe crée une chaîne brute (par exemple,r'\t'
est une barre oblique inversée +t
au lieu d'un onglet), et des guillemets triples'''...'''
ou"""..."""
autorisent des littéraux de chaîne multi-lignes.la source
'A' == b'A' --> False
chèque le rend vraiment clair. Le reste est excellent, mais jusqu'à ce moment-là, je n'avais pas bien compris qu'une chaîne d'octets n'était pas vraiment du texte.'שלום עולם' == 'hello world'
Le b désigne une chaîne d'octets.
Les octets sont les données réelles. Les cordes sont une abstraction.
Si vous aviez un objet chaîne à plusieurs caractères et que vous preniez un seul caractère, ce serait une chaîne, et sa taille pourrait être supérieure à 1 octet, selon l'encodage.
Si vous preniez 1 octet avec une chaîne d'octets, vous obtiendriez une seule valeur de 8 bits de 0 à 255 et elle pourrait ne pas représenter un caractère complet si ces caractères dus au codage étaient> 1 octet.
TBH J'utiliserais des chaînes sauf si j'avais une raison spécifique de bas niveau d'utiliser des octets.
la source
Du côté serveur, si nous envoyons une réponse, elle sera envoyée sous la forme d'un type d'octet, elle apparaîtra donc dans le client comme
b'Response from server'
Pour vous débarrasser de
b'....'
simplement utiliser le code ci-dessous:Fichier serveur:
Fichier client:
puis il imprimera
Response from server
la source
Voici un exemple où l'absence de
b
lève uneTypeError
exception dans Python 3.xL'ajout d'un
b
préfixe résoudrait le problème.la source
Il le transforme en
bytes
littéral (oustr
en 2.x), et est valide pour 2.6+.Le
r
préfixe fait que les barres obliques inverses sont "non interprétées" (non ignorées, et la différence est importante).la source
str
dans un 2.x dans les deux cas, donc on pourrait dire qu'il est ignoré. La distinction est importante lorsque vous importez àunicode_literals
partir du__future__
module.En plus de ce que d'autres ont dit, notez qu'un seul caractère en unicode peut être composé de plusieurs octets .
La façon dont fonctionne unicode est qu'il a fallu l'ancien format ASCII (code 7 bits qui ressemble à 0xxx xxxx) et ajouté des séquences multi-octets où tous les octets commencent par 1 (1xxx xxxx) pour représenter les caractères au-delà de l'ASCII afin que Unicode soit en arrière -compatible avec ASCII.
la source
Vous pouvez utiliser JSON pour le convertir en dictionnaire
{"valeur clé"}
BALLON:
Ceci est un exemple de flacon. Exécutez ceci sur la ligne du terminal:
Dans le flacon / routes.py
{'valeur clé'}
la source