有没有办法将.decode
调用挂钩到格式规范中?可能有原因,即大缓冲区,而不是解码所有内容,并且在每个参数上调用decode
可能不方便。
In [473]: print(b'hello world' + b', John')
b'hello world, John'
但是:
In [475]: print('{}, {}'.format(b'hello world', b'John'))
b'hello world', b'John'
格式字符串仍然是字符串文字,只包含'b',所以:
In [477]: print('{}, {}'.format(b'hello world', b'John').encode())
b"b'hello world', b'John'"
编辑,这样的事情也是可能的,但盲目地循环尝试例外是相当糟糕的:
def decoder_step(s):
try: return s.decode()
except: return s
decoder = lambda x: tuple(decoder_step(s) for s in x)
In [3]: "{} {} {}".format(*decoder([b'foo', 3, b'bar', 'man']))
Out[3]: 'foo 3 bar'
答案 0 :(得分:1)
您正在寻找的行为目前在Python中不存在。无法使用unicode
格式字符串并将bytes
个对象插入其中,以便自动解码它们。这是一个设计决策,因为自动解码通常是错误的来源(如果bytes
无法使用默认编码解码,代码应该怎么做?)。如果要将编码文本插入Unicode字符串,请先正确解码!
但是,感谢PEP 461,Python 3.5将允许bytes
个对象使用%
运算符的旧式文本格式。因此,b"%s %s" % (b"Hello", b"World")
将起作用,创建一个新的bytes
对象。此功能主要用于实现HTTP和SMTP等协议,这些协议被指定为使用ASCII文本作为命令和响应。如果你正在处理用户数据而不是人类可读的二进制协议,你不应该使用bytes
对象进行任何字符串格式化,而是在除了裸机之外的任何地方使用Unicode(甚至在那里,Python的IO代码)经常可以为你处理编码和解码。)
答案 1 :(得分:0)
好吧有
In [1]: print(bytes('{}, {}'.format('hello world', 'John'),'utf-8'))
b'hello world, John'
这是你需要的,还是你只想在格式中使用的东西?