Answers:
如果使用多个参数,则必须将其放在一个元组中(请注意额外的括号):
'%s in %s' % (unicode(self.author), unicode(self.publication))
正如EOL所指出的那样,该unicode()
函数通常假定默认为ascii编码,因此,如果您使用非ASCII字符,则显式传递编码会更安全:
'%s in %s' % (unicode(self.author,'utf-8'), unicode(self.publication('utf-8')))
从Python 3.0开始,最好改用以下str.format()
语法:
'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
format
以下是文档摘录:
给定的
format % values
中的%
转换规范format
将替换为的零个或多个元素values
。效果类似于使用sprintf()
C语言中的用法。如果
format
需要单个参数,则值可以是单个非元组对象。否则,值必须是一个具有由format
string 指定的项目数的元组,或者是一个映射对象(例如,字典)。
str.format
而不是%
%
操作员的新替代方法是使用str.format
。以下是文档摘录:
str.format(*args, **kwargs)
执行字符串格式化操作。调用此方法的字符串可以包含文字文本或用大括号分隔的替换字段
{}
。每个替换字段都包含位置参数的数字索引或关键字参数的名称。返回字符串的副本,其中每个替换字段都用相应参数的字符串值替换。此方法是Python 3.0中的新标准,应优先于
%
formatting。
以下是一些用法示例:
>>> '%s for %s' % ("tit", "tat")
tit for tat
>>> '{} and {}'.format("chicken", "waffles")
chicken and waffles
>>> '%(last)s, %(first)s %(last)s' % {'first': "James", 'last': "Bond"}
Bond, James Bond
>>> '{last}, {first} {last}'.format(first="James", last="Bond")
Bond, James Bond
'{self.author} in {self.publication}'.format(self=self)
应该“起作用”。我只是不确定整个unicode
事情。
{first[0]}
过首字母缩写J
。
到目前为止,发布的一些答案存在一个严重的问题:unicode()
从默认编码(通常为ASCII)解码;实际上,unicode()
试图通过将给定的字节转换为字符来“感知”。因此,以下代码(基本上是前面的答案所建议的)在我的计算机上失败:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
给出:
Traceback (most recent call last):
File "test.py", line 3, in <module>
print '{0}'.format(unicode(author))
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 0: ordinal not in range(128)
失败的原因是author
不只包含ASCII字节(即[0; 127]中的值),并且unicode()
默认情况下(在许多计算机上)从ASCII解码。
一个可靠的解决方案是显式提供您的字段中使用的编码。以UTF-8为例:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(或不使用initial u
,这取决于您要使用Unicode结果还是字节字符串)。
在这一点上,可能要考虑让author
and publication
字段为Unicode字符串,而不是在格式化期间对其进行解码。
'{} in {}'
格式字符串。