Відповіді:
Відповідь Марка Сідаде правильна - вам потрібно поставити кортеж.
Однак з Python 2.6 ви можете використовувати formatзамість %:
'{0} in {1}'.format(unicode(self.author,'utf-8'), unicode(self.publication,'utf-8'))
Використання %для форматування рядків більше не рекомендується.
Цей спосіб форматування рядків є новим стандартом в Python 3.0, і його слід віддавати перевагу формату%, описаному в String Formatting Operations в новому коді.
Якщо ви використовуєте більше одного аргументу, він повинен бути в кордоні (зверніть увагу на додаткові дужки):
'%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()в мові С.Якщо
formatпотрібен один аргумент, значення можуть бути одним об'єктом, що не змінюється. В іншому випадку значення повинні бути кортежем із точно кількістю елементів, визначенихformatрядком , або одним об'єктом відображення (наприклад, словником).
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))
Тут, за перший буде розміщений. А для другого , то буде використовуватися.%sunicode(self.author)%sunicode(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, замість того, щоб декодувати їх під час форматування.
Для python2 ви також можете це зробити
'%(author)s in %(publication)s'%{'author':unicode(self.author),
'publication':unicode(self.publication)}
що зручно, якщо у вас є багато аргументів на заміну (особливо якщо ви робите інтернаціоналізацію)
Підтримка Python2.6 і далі .format()
'{author} in {publication}'.format(author=self.author,
publication=self.publication)
'{} in {}'рядок простого формату.