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

Is there a formatted byte string literal in Python 3.6+?

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

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

可能是 fb"Some format string {name}"

有这种东西吗?

这是从 python 2 到 python3 所做的较大更改之一。他们以不同的方式处理 unicode 和字符串。

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

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

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

string.decode()

通过 Charles Severence 的 coursera lecture,我更好地理解了 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())

没有。 The idea is explicitly dismissed in the PEP:

For the same reason that we don't support bytes.format(), you may not combine 'f' with 'b' string literals. The primary problem is that an object's __format__() method may return Unicode data that is not compatible with a bytes string.

Binary f-strings would first require a solution for bytes.format(). This idea has been proposed in the past, most recently in PEP 461. The discussions of such a feature usually suggest either

  • adding a method such as __bformat__() so an object can control how it is converted to bytes, or

  • having bytes.format() not be as general purpose or extensible as str.format().

Both of these remain as options in the future, if such functionality is desired.

来自 python 3.6.2 字节的这种百分比格式适用于某些用例:

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

但作为 AXO :

This is not the same. %a (or %r) will give the representation of the string, not the string iteself. For example b'%a' % b'bytes' will give b"b'bytes'", not 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,但文档中 Bytes Object 标题底部的注释似乎表明这应该适用于所有 3.x(使用 str.format() 版本 <3.6,因为那是添加 f-strings 的时候,但 OP 特别询问 3.6+)。