【问题标题】:Is there a formatted byte string literal in Python 3.6+?Python 3.6+ 中是否有格式化的字节字符串文字?
【发布时间】:2018-01-03 18:07:36
【问题描述】:

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

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

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

这样的事情存在吗?

【问题讨论】:

  • 我不这么认为。 bytes 甚至没有 .format 方法,所以,如果他们有 f 字符串等价物,我会感到惊讶。你会得到最接近的是bytes formatting

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


【解决方案1】:

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

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

b'Some format string Hello'

警告:这对我来说适用于 3.8,但请注意文档中 Bytes Object 标题底部的注释似乎表明这应该适用于所有 3.x 中的任何字符串格式化方法(使用 str.format()对于版本

【讨论】:

    【解决方案2】:

    在 3.6+ 中你可以这样做:

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

    【讨论】:

    • 如果要使用字节格式,可能是因为要格式化的数据(此处为a)是字节。将其解码为(可能无效的)unicode,然后返回字节是自找麻烦。
    • 这不是潜在的无效,它很可能不是你想要的:如果abytes类型,那么f{a}.encode()会给出b"b'123'"
    【解决方案3】:

    从 python 3.6.2 开始,这种字节百分比格式适用于某些用例:

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

    但是作为AXOcommented:

    这不一样。 %a(或%r)将给出字符串的表示,而不是字符串本身。例如b'%a' % b'bytes' 将给出b"b'bytes'",而不是b'bytes'

    这取决于您是否需要在 UI 中显示格式化的 byte_or_unicode_string 或者您是否可能需要进行进一步的操作。

    【讨论】:

    • 这不一样。 %a(或%r)将给出字符串的表示,而不是字符串本身。例如b'%a' % b'bytes' 将给出b"b'bytes'",而不是b'bytes'
    • 我认为您的意思是 %smy_byte_string,例如以 AXO 为例,b'%s' % b'bytes' -> b'bytes'
    【解决方案4】:

    这是从 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())
    

    【讨论】:

    • 感谢您的时间和努力,但您的回答与问题无关。
    • 我特别理解 Enrico 的问题,他如何在 Python 3 中转换字节和字符串,在新版本中这一领域发生了重大变化。我的回答旨在帮助他了解这种变化是如何发生的,以及他如何在 Python 3 中处理类似的操作。这就是为什么我觉得这个回答与他的问题相关。
    【解决方案5】:

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

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

    二进制 f 字符串首先需要一个解决方案 bytes.format()。这个想法在过去已经提出,大多数 最近在PEP 461。这种特性的讨论通常 建议要么

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

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

    如果这些功能在未来保留为选项 是需要的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-29
      • 2016-12-10
      • 1970-01-01
      • 1970-01-01
      • 2019-05-09
      • 2020-01-24
      相关资源
      最近更新 更多