Python 3.6 + 中是否有格式化的字节字符串文字?

我正在寻找一个格式化的字节字符串文字

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

可能是 fb"Some format string {name}"之类的。

有这种东西吗?

27468 次浏览

这是 python2到 python3之间较大的变化之一,它们处理 unicode 和字符串的方式不同。

这就是转换字节的方法。

string = "some string format"
string.encode()
print(string)

这就是解码字符串的方法。

string.decode()

通过 Charles Severence 的这个 Coursera 讲座,我更好地理解了 Python2与3更改为 unicode 之间的区别。您可以观看整个17分钟的视频,或者快进到10:30左右,如果您想了解 Python 2和3之间的区别,以及它们如何处理字符,特别是 unicode。

我理解您的实际问题是如何格式化同时包含字符串和字节的字符串。

inBytes = b"testing"
inString = 'Hello'
type(inString) #This will yield <class 'str'>
type(inBytes) #this will yield <class 'bytes'>

这里您可以看到我有一个字符串,一个变量和一个字节变量。

这就是将字节和字符串组合成一个字符串的方法。

formattedString=(inString + ' ' + inBytes.encode())

没有:

出于同样的原因,我们不支持 bytes.format(),你可以 不要将 'f''b'字符串字面值组合在一起 对象的 __format__()方法可以返回 Unicode 数据 与字节字符串不兼容的。

二进制 f 字符串首先需要解决 这个想法在过去已经被提出,大多数 最近在 PEP 461。这样一个功能的讨论通常 都不是

  • 添加诸如 __bformat__()之类的方法,以便对象可以控制如何将其转换为字节,或者

  • 具有 bytes.format()不像 str.format()那样具有通用性或可扩展性。

如果这样的功能存在的话,这两者在将来都将作为选项 是我们渴望的。

在 python 3.6.2中,字节的百分比格式化适用于某些用例:

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

但作为 AXO 评论:

这不一样。%a(或 %r)将给出字符串的表示,而不是字符串本身。例如,b'%a' % b'bytes'将给出 b"b'bytes'",而不是 b'bytes'

根据您是否需要在 UI 中仅显示带格式的 byte _ or _ unicode _ string,或者是否可能需要进一步操作,这两者可能有关系,也可能无关紧要。

在3.6 + 中,你可以做到:

>>> a = 123
>>> f'{a}'.encode()
b'123'

实际上,您的建议非常接近; 如果您在 bytes()调用中添加一个 encoding kwarg,那么您将得到所需的行为:

>>> name = "Hello"
>>> bytes(f"Some format string {name}", encoding="utf-8")


b'Some format string Hello'

注意: 对我来说,这在3.8版本中是可行的,但是请注意,在文档的 字节对象标题的底部,似乎建议这应该适用于所有3.x 版本中的任何字符串格式化方法(对于版本 < 3.6的版本,使用 str.format(),因为那时添加了 f 字符串,但是 OP 特别要求大约3.6 +)。