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

Python 3.6+;中是否有格式化的字节字符串文本;?,python,python-3.x,string-interpolation,f-string,Python,Python 3.x,String Interpolation,F String,我正在寻找格式化的字节字符串文本。具体来说,相当于 name = "Hello" bytes(f"Some format string {name}") 可能类似于fb“某些格式字符串{name}” 这样的东西存在吗?这是从Python2到python3所做的较大更改之一。它们处理unicode和字符串的方式不同 这就是转换为字节的方式 string = "some string format" string.encode() print(string) 这是您解码为字符串的方式 strin

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

name = "Hello"
bytes(f"Some format string {name}")
可能类似于
fb“某些格式字符串{name}”


这样的东西存在吗?

这是从Python2到python3所做的较大更改之一。它们处理unicode和字符串的方式不同

这就是转换为字节的方式

string = "some string format"
string.encode()
print(string)
这是您解码为字符串的方式

string.decode()
通过Charles Severence的这篇文章,我对Python2和Python3之间的差异有了更好的理解,这是对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'>
编号:

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

二进制f字符串首先需要解决以下问题:
bytes.format()
。这一想法在过去已经被提出过,大多数人都是这样认为的 最近在。对这样一个特征的讨论通常是 建议

  • 添加一个方法,例如
    \uuuu bformat\uuuu()
    ,以便对象可以控制如何将其转换为字节,或者

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

这两种功能在将来都将保留为选项(如果有) 这是需要的


在python 3.6.2中,字节的这种百分比格式适用于某些用例:

打印(b“一些内容%a.一些其他内容”%my\u byte\u或\u unicode\u string)

但作为:


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

这可能重要,也可能不重要,这取决于您是否需要在UI中仅显示格式化字节或unicode字符串,或者您是否可能需要进一步操作。

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

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

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

>>name=“你好”
>>>字节(f“某些格式字符串{name}”,encoding=“utf-8”)
b'Some format string Hello'

警告:这对我来说在3.8中是有效的,但文档标题底部的注释似乎表明这应该适用于所有3.x中的任何字符串格式设置方法(使用
str.format()
对于版本,我不这么认为。
字节
甚至没有
格式
方法,因此,如果它们有f-string等价物,我会感到惊讶。最接近你的是我感谢你的时间和努力,但你的回答与问题无关。我理解Enrico的问题,特别是他如何转换字节和字符串我的回答是为了帮助他理解这种变化是如何发生的,以及他如何在Python 3中处理类似的操作。这就是为什么我觉得这个回答与他的问题相关。这是不同的。
%a
(或
%r
)将给出字符串的表示形式,而不是字符串本身。例如
b'%a'%b'bytes'
将给出
b“b'bytes''
,而不是
b'bytes'
。我想你的意思是
%s
mybyte\u string
,例如,按照AXO的例子,
b'%s'%b'bytes'
->
b'bytes'
如果你想使用bytes格式,可能是因为你想格式化的数据(
a
这里)是字节。解码为(可能无效)unicode然后返回字节是自找麻烦。它不是潜在的无效,很可能不是你想要的:如果
a
bytes
类型,那么
f{a}.encode()
将给出
b“b'123'
>>> a = 123
>>> f'{a}'.encode()
b'123'