60

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

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

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

这样的事情存在吗?

4

5 回答 5

56

,这个想法在 PEP 中被明确驳回

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

二进制 f 字符串首先需要 bytes.format(). 这个想法过去曾被提出,最近一次是在PEP 461中。对这种特性的讨论通常建议要么

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

  • bytes.format()不像str.format(). _

如果需要这样的功能,这两者在未来仍然是选项。

于 2017-07-27T21:09:43.347 回答
14

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

>>> a = 123
>>> f'{a}'.encode()
b'123'
于 2020-12-03T10:47:39.327 回答
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 或者您是否可能需要进行进一步的操作,这可能会或可能无关紧要。

于 2018-06-22T13:07:33.720 回答
4

您的建议实际上非常接近;如果您在通话中添加一个encodingkwarg bytes(),那么您将获得所需的行为:

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

b'Some format string Hello'

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

于 2021-06-10T00:36:29.537 回答
-4

这是从 python 2 到 python3 的较大变化之一。它们以不同的方式处理 unicode 和字符串。

这就是您转换为字节的方式。

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

这就是您解码为字符串的方式。

string.decode()

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

我了解您的实际问题是如何格式化同时具有字符串和字节的字符串。

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

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

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

formattedString=(inString + ' ' + inBytes.encode())
于 2017-07-27T20:46:50.180 回答