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

Enr*_*rba 25 python string-interpolation python-3.x f-string

我正在寻找格式化的字节字符串文字.具体来说,相当于

name = "Hello"
bytes(f"Some format string {name}")
Run Code Online (Sandbox Code Playgroud)

可能是类似的东西fb"Some format string {name}".

这样的事情存在吗?

jwo*_*der 23

不会. 这个想法在PEP中明确被驳回:

出于我们不支持的相同原因bytes.format(),您可能无法'f''b'字符串文字结合使用.主要问题是对象的__format__()方法可能返回与字节字符串不兼容的Unicode数据.

二进制f字符串首先需要一个解决方案 bytes.format().这个想法在过去曾被提出,最近一次是在PEP 461中提出的.对这种特征的讨论通常也表明了这一点

  • 添加一个方法,如__bformat__()一个对象可以控制它如何转换为字节,或

  • 具有bytes.format()不那么通用或可扩展为str.format().

如果需要这样的功能,这两个仍然是未来的选择.


小智 9

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

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

b'Some format string Hello'
Run Code Online (Sandbox Code Playgroud)

警告:这对我来说适用于 3.8,但请注意文档中字节对象标题的底部似乎表明这应该适用于所有 3.x 中的任何字符串格式化方法(用于str.format()<3.6 版本,因为那时添加了 f 字符串,但 OP 特别询问了 3.6+)。


Bob*_*dan 6

从 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 或者您是否可能需要进行进一步的操作,这可能重要也可能无关紧要。


joh*_*son 6

在 3.6+ 中,您可以执行以下操作:

>>> a = 123
>>> f'{a}'.encode()
b'123'
Run Code Online (Sandbox Code Playgroud)

  • 它不一定无效,很可能不是您想要的:如果 `a` 的类型为 `bytes`,则 `f{a}.encode()` 会给出 `b"b'123'"` (4认同)
  • 如果您想使用字节格式,可能是因为您想要格式化的数据(此处为“a”)是字节。将其解码为(可能无效的)unicode,然后返回字节是自找麻烦。 (2认同)