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+)。
我正在寻找格式化的字节字符串文字。具体来说,相当于
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, orhaving
bytes.format()
not be as general purpose or extensible asstr.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 exampleb'%a' % b'bytes'
will giveb"b'bytes'"
, notb'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+)。