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

时间:2017-07-27 20:31:02

标签: python python-3.x string-interpolation f-string

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

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

可能类似于fb"Some format string {name}"

这样的事情存在吗?

6 个答案:

答案 0 :(得分:18)

没有。 The idea is explicitly dismissed in the PEP

  

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

     

二进制f字符串首先需要一个解决方案   bytes.format()。大多数人过去曾提出过这个想法   最近在PEP 461。通常讨论这样一个功能   建议

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

  •   
  • bytes.format()不能像str.format()那样具有通用性或可扩展性。

  •   
     

如果有这样的功能,这两个仍然是未来的选择   是理想的。

答案 1 :(得分:4)

从python 3.6.2开始,这种百分比格式的字节有效:

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

答案 2 :(得分:2)

在3.6及更高版本中,您可以执行以下操作:

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

答案 3 :(得分:0)

我设法格式化文字以通过套接字发送它:

msgIndex = 0
while(IsSomeCondition()):
  msgIndex += 1
  sock.sendto(
    b"msg number %s" % bytes(str(msgIndex), encoding="utf8"),
    (receiverIP, receiverPort)
  )
# --> b'msg number 1'
# --> b'msg number 2'
# --> b'msg number 3'

我正在使用Python 3.8.5。

答案 4 :(得分:0)

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

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

b'Some format string Hello'

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

答案 5 :(得分:-3)

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

这是你如何转换为字节。

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

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

string.decode()

我对Charles Severence通过这个coursera lecture的Python 2与unicode 3的变化之间的差异有了更好的认识。如果你想了解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())