回答:
複数の引数を使用している場合は、タプルで指定する必要があります(余分な括弧に注意してください)。
'%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
0個以上の要素に置き換えられますvalues
。効果はsprintf()
、C言語での使用に似ています。
format
単一の引数が必要な場合、値は単一の非タプルオブジェクトの場合があります。それ以外の場合、値は、format
stringで指定されたアイテム数と同じタプル、または単一のマッピングオブジェクト(ディクショナリなど)である必要があります。
str.format
代わりに%
%
演算子の新しい代替手段はを使用することstr.format
です。ドキュメントからの抜粋です:
str.format(*args, **kwargs)
文字列フォーマット操作を実行します。このメソッドが呼び出される文字列には、中括弧で区切られたリテラルテキストまたは置換フィールドを含めることができます
{}
。各置換フィールドには、位置引数の数値インデックスまたはキーワード引数の名前が含まれます。各置換フィールドが対応する引数の文字列値で置き換えられた文字列のコピーを返します。このメソッドはPython 3.0の新しい標準であり、
%
フォーマットよりも推奨されます。
以下に使用例をいくつか示します。
>>> '%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
。
値を括弧に入れる必要があります:
'%s in %s' % (unicode(self.author), unicode(self.publication))
ここでは、最初のために配置されます。そして2番目のには、が使用されます。%s
unicode(self.author)
%s
unicode(self.publication)
注:表記
string formatting
よりも優先する必要があり%
ます。詳細はこちら
%s
ではなく、信じられませんformat
これまでに投稿された回答のいくつかには重大な問題があり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'))
(またはu
、Unicodeの結果が必要かバイト文字列が必要かによっては、最初のなし)。
この時点で、フォーマット中にデコードするのではなくauthor
、publication
フィールドとフィールドをUnicode文字列にすることを検討することをお勧めします。
'{} in {}'
ます。つまり、プレーンなフォーマット文字列を使用できます。