web-dev-qa-db-fra.com

Existe-t-il un littéral de chaîne d'octets formaté dans Python 3.6+?

Je recherche un littéral de chaîne d'octets formaté. Plus précisément, quelque chose d'équivalent à

name = "Hello"
bytes(f"Some format string {name}")

Peut-être quelque chose comme fb"Some format string {name}".

Une telle chose existe-t-elle?

34
Enrico Borba

Non. L'idée est explicitement rejetée dans le PEP :

Pour la même raison que nous ne prenons pas en charge bytes.format(), vous ne pouvez pas combiner 'f' Avec 'b' Littéraux de chaîne. Le problème principal est que la méthode __format__() d'un objet peut renvoyer des données Unicode qui ne sont pas compatibles avec une chaîne d'octets.

Les chaînes f binaires nécessiteraient d'abord une solution pour bytes.format(). Cette idée a été proposée dans le passé, plus récemment dans PEP 461 . Les discussions sur une telle fonctionnalité suggèrent généralement

  • ajouter une méthode telle que __bformat__() pour qu'un objet puisse contrôler comment il est converti en octets, ou

  • avoir bytes.format() ne doit pas être aussi polyvalent ou extensible que str.format().

Ces deux options restent à l’avenir si une telle fonctionnalité est souhaitée.

21
jwodder

De python 3.6.2 ce formatage en pourcentage pour les octets fonctionne pour certains cas d'utilisation:

print(b"Some stuff %a. Some other stuff" % my_byte_or_unicode_string)

Mais comme l'a noté un commentateur:

Ce n'est pas pareil. % a (ou% r) donnera la représentation de la chaîne, pas la chaîne elle-même. Par exemple, b '% a'% b'bytes 'donnera b "b'bytes'", pas b'bytes '.

Ce qui peut ou non avoir de l'importance selon que vous devez simplement présenter l'octet_or_unicode_string formaté dans une interface utilisateur ou si vous avez besoin de faire d'autres manipulations.

3
Bob Jordan