Відповіді:
Відповідь Марка Сідаде правильна - вам потрібно поставити кортеж.
Однак з 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))
Тут, за перший буде розміщений. А для другого , то буде використовуватися.%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, замість того, щоб декодувати їх під час форматування.
Для 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 {}'
рядок простого формату.