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?
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, ouavoir
bytes.format()
ne doit pas être aussi polyvalent ou extensible questr.format()
.Ces deux options restent à l’avenir si une telle fonctionnalité est souhaitée.
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.