Python使用格式规范的字节

时间:2015-03-01 18:11:28

标签: python

有没有办法将.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'

2 个答案:

答案 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'

这是你需要的,还是你只想在格式中使用的东西?