繁体   English   中英

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}"

这样的事情存在吗?

。 PEP 明确驳回了这个想法

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

二进制 f 字符串首先需要bytes.format()的解决方案。 这个想法过去曾被提出,最近一次是在PEP 461 中 对此类功能的讨论通常建议

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

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

如果需要此类功能,这两种方法在未来都将保留为选项。

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

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

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

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

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

b'Some format string Hello'

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

如此所述,您可以这样格式化:

>>> name = b"Hello"
>>> b"Some format string %b World" % name
b'Some format string Hello World'

您可以在PEP 461中查看更多详细信息

请注意,在您的示例中,您可以简单地执行以下操作:

>>> name = b"Hello"
>>> b"Some format string " + name
b'Some format string Hello'

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

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

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

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

string.decode()

通过 Charles Severence 的这个coursera 讲座,我对 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())

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM