Que signifie le préfixe ab avant une chaîne python?

107

Dans un code source python sur lequel je suis tombé par hasard, j'ai vu un petit b avant une chaîne comme dans:

b"abcdef"

Je connais le upréfixe signifiant une chaîne unicode et le rpréfixe d'un littéral de chaîne brute.

Que signifie le bcode et dans quel type de code source est-il utile car il semble être exactement comme une chaîne simple sans aucun préfixe?

Kriss
la source
10
@SLott: suivez le lien que vous avez fourni, vous verrez que le préfixe b n'est pas autorisé dans le préfixe de chaîne ... pour 2.6 (ressemble à une erreur mineure dans le matériel de référence). Et googler ce genre de choses n'est pas facile. J'ai essayé des mots-clés comme "b préfixe de chaîne python" et je n'ai abouti à rien.
kriss
Le lien utilisé par S.Lott n'a pas de spécificateur de version; il s'agit de Python 3: docs.python.org/3/reference/… . Le préfixe est désormais également pris en charge dans Python 2.6 et versions ultérieures pour faciliter le code Python entre versions.
Martijn Pieters
1
cette question n'est ni "une copie exacte" ni une réponse à la question "Puis-je me débarrasser de ce caractère 'b' dans ma déclaration imprimée?" stackoverflow.com/questions/42599851/ ... cela vous dérangerait-il de ne pas marquer ça, marijin? la personne qui a posé la question ainsi que la personne qui a effectivement tenté de répondre pourraient apprécier de pouvoir avoir une réponse à la question posée.
me_

Réponses:

62

C'est bytes littéral Python3 . Ce préfixe est absent dans Python 2.5 et plus ancien (il équivaut à une chaîne simple de 2.x, tandis que la chaîne simple de 3.x équivaut à un littéral avec un upréfixe dans 2.x). En Python 2.6+ , il est équivalent à une chaîne simple, pour la compatibilité avec 3.x .

wRAR
la source
@WRAR: Était en code python 2.6, j'ai vu cela, il semble qu'il a été introduit dans python2.6
kriss
Je l'ai spécifiquement vérifié dans la référence 2.6 avant de publier: docs.python.org/reference/lexical_analysis.html#literals
wRAR
1
OK, "Pour une compatibilité future, Python 2.6 ajoute des octets comme synonyme du type str, et il prend également en charge la notation b ''.", À partir de "Quoi de neuf".
wRAR
comme les liens ci-dessus pointent maintenant vers la référence 2.7 et le préfixe b a été ajouté, voici un lien vers une ancienne fausse référence docs.python.org/release/2.6.8/reference
kriss
98

Le bpréfixe signifie une byteschaîne littérale .

Si vous le voyez utilisé dans le code source Python 3, l'expression crée un bytesobjet , pas un objet Unicodestr normal . Si vous le voyez en écho dans votre shell Python ou dans le cadre d'une liste, d'un dict ou d'un autre contenu de conteneur, vous voyez un bytesobjet représenté à l'aide de cette notation.

bytesLes objets contiennent essentiellement une séquence d'entiers compris entre 0 et 255, mais lorsqu'ils sont représentés, Python affiche ces octets sous forme de points de code ASCII pour faciliter la lecture de leur contenu. Tous les octets en dehors de la printable plage de caractères ASCII sont représentés comme des séquences d'échappement (par exemple \n, \x82, etc.). Inversement, vous pouvez utiliser à la fois des caractères ASCII et des séquences d'échappement pour définir des valeurs d'octet; pour les valeurs ASCII, leur valeur numérique est utilisée (par exemple b'A'== b'\x41')

Étant donné qu'un bytesobjet est constitué d'une séquence d'entiers, vous pouvez construire un bytesobjet à partir de n'importe quelle autre séquence d'entiers avec des valeurs comprises entre 0 et 255, comme une liste:

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

et l'indexation vous rend les entiers (mais le découpage produit une nouvelle bytesvaleur; pour l'exemple ci-dessus, value[0]vous donne 72, mais value[:1]c'est b'H'comme 72 est le point de code ASCII pour la lettre majuscule H ).

bytesmodèle de données binaires , y compris le texte codé . Si votre bytesvaleur contient du texte, vous devez d'abord le décoder en utilisant le bon codec. Si les données sont encodées en UTF-8, par exemple, vous pouvez obtenir une strvaleur Unicode avec:

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

Inversement, pour passer du texte dans un strobjet à bytesvous devez encoder . Vous devez décider du codage à utiliser; la valeur par défaut est d'utiliser UTF-8, mais ce dont vous aurez besoin dépend fortement de votre cas d'utilisation:

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

Vous pouvez également utiliser le constructeur bytes(strvalue, encoding)pour faire de même.

Les méthodes de décodage et d'encodage prennent un argument supplémentaire pour spécifier comment les erreurs doivent être gérées .

Python 2, les versions 2.6 et 2.7 prennent également en charge la création de littéraux de chaîne à l'aide de b'..'la syntaxe de littéral de chaîne, pour faciliter le code qui fonctionne à la fois sur Python 2 et 3.

bytesles objets sont immuables, tout comme les strchaînes. Utilisez un bytearray()objet si vous avez besoin d'une valeur d'octets mutable.

Martijn Pieters
la source