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

vwoqyblh  于 2022-12-30  发布在  Python
关注(0)|答案(6)|浏览(119)

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

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

可能是fb"Some format string {name}"之类的。
有这种东西吗?

wqsoz72f

wqsoz72f1#

不。这个想法在PEP中被明确驳回:
由于同样的原因,我们不支持bytes.format(),你不能把'f''b'字符串常量结合起来,主要的问题是对象的__format__()方法可能返回与bytes字符串不兼容的Unicode数据。
二进制f字符串首先需要bytes.format()的解。这个想法在过去已经被提出过,最近在PEP 461中。对这样一个特性的讨论通常建议

  • 添加__bformat__()之类的方法,以便对象可以控制如何将其转换为字节,或者
  • 使得bytes.format()不像str.format()那样通用或可扩展。

如果需要这种功能,这两种功能都将作为未来的选项。

e5njpo68

e5njpo682#

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

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

o4hqfura3#

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

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

b'Some format string Hello'

警告:这对我来说在Python 3.8中是有效的,但是文档中Bytes Object标题底部的注解似乎建议这应该适用于所有Python 3.x中的任何字符串格式化方法(对于版本〈3.6使用str.format(),因为那时添加了f字符串,但是OP特别询问了3.6+)。

hsvhsicv

hsvhsicv4#

在python 3.6.2中,字节的这种百分比格式适用于某些用例:
第一个月
但正如AXO评论的:
这是不一样的。%a(或%r)将给予字符串的表示,而不是字符串本身。例如b'%a' % b'bytes'将给出b"b'bytes'",而不是b'bytes'
这可能有也可能没有关系,具体取决于您是否只需要在UI中显示格式化的byte_or_unicode_string,或者您是否可能需要执行进一步的操作。

zrfyljdw

zrfyljdw5#

here所示,您可以采用以下格式:

>>> 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'
sgtfey8w

sgtfey8w6#

这是从python2到python3最大的变化之一,它们处理unicode和字符串的方式不同。
这就是转换成字节的方法。

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

这就是你解码成字符串的方法。

string.decode()

通过Charles Severence的coursera lecture,我对Python 2和Python 3在Unicode上的区别有了更好的理解,如果你想了解Python 2和Python 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())

相关问题