Respuestas:
La respuesta de Mark Cidade es correcta: debe proporcionar una tupla.
Sin embargo, desde Python 2.6 en adelante puede usar en formatlugar de %:
'{0} in {1}'.format(unicode(self.author,'utf-8'), unicode(self.publication,'utf-8'))
%Ya no se recomienda el uso de para formatear cadenas.
Este método de formateo de cadenas es el nuevo estándar en Python 3.0, y debe preferirse al formato% descrito en Operaciones de formateo de cadenas en código nuevo.
Si está utilizando más de un argumento, debe estar en una tupla (tenga en cuenta los paréntesis adicionales):
'%s in %s' % (unicode(self.author), unicode(self.publication))
Como señala EOL, la unicode()función generalmente asume la codificación ascii como predeterminada, por lo que si tiene caracteres no ASCII, es más seguro pasar explícitamente la codificación:
'%s in %s' % (unicode(self.author,'utf-8'), unicode(self.publication('utf-8')))
Y a partir de Python 3.0, se prefiere usar la str.format()sintaxis en su lugar:
'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))
formatLo siguiente es un extracto de la documentación:
Dado
format % values,%las especificaciones de conversión enformatse reemplazan con cero o más elementos devalues. El efecto es similar al usosprintf()en el lenguaje C.Si
formatrequiere un único argumento, los valores pueden ser un único objeto sin tupla. De lo contrario, los valores deben ser una tupla con exactamente el número de elementos especificados por laformatcadena , o un solo objeto de mapeo (por ejemplo, un diccionario).
str.formatlugar de%Una alternativa más nueva al %operador es usar str.format. Aquí hay un extracto de la documentación:
str.format(*args, **kwargs)Realizar una operación de formateo de cadena. La cadena en la que se llama a este método puede contener texto literal o campos de reemplazo delimitados por llaves
{}. Cada campo de reemplazo contiene el índice numérico de un argumento posicional o el nombre de un argumento de palabra clave. Devuelve una copia de la cadena donde cada campo de reemplazo se reemplaza con el valor de cadena del argumento correspondiente.Este método es el nuevo estándar en Python 3.0, y debería preferirse al
%formateo .
Aquí hay algunos ejemplos de uso:
>>> '%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)"debería funcionar". Simplemente no estoy seguro de todo el unicodeasunto.
{first[0]}para obtener la inicial J.
Solo debes poner los valores entre paréntesis:
'%s in %s' % (unicode(self.author), unicode(self.publication))
Aquí, por primera %sel unicode(self.author)será colocado. Y para el segundo %s, unicode(self.publication)se utilizará el.
Nota: debe favorecer
string formattingsobre la%notación. Más información aquí.
%slugar de esoformat
Hay un problema importante con algunas de las respuestas publicadas hasta ahora: unicode()decodifica desde la codificación predeterminada, que a menudo es ASCII; de hecho, unicode()trata de dar "sentido" a los bytes que se le dan al convertirlos en caracteres. Por lo tanto, el siguiente código, que es esencialmente lo que recomiendan las respuestas anteriores, falla en mi máquina:
# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))
da:
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)
La falla proviene del hecho de que authorno contiene solo bytes ASCII (es decir, con valores en [0; 127]), y unicode()decodifica desde ASCII por defecto (en muchas máquinas).
Una solución robusta es dar explícitamente la codificación utilizada en sus campos; tomando UTF-8 como ejemplo:
u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))
(o sin la inicial u, dependiendo de si desea un resultado Unicode o una cadena de bytes).
En este punto, uno podría considerar tener los campos authory publicationcomo cadenas Unicode, en lugar de decodificarlos durante el formateo.
Para python2 también puedes hacer esto
'%(author)s in %(publication)s'%{'author':unicode(self.author),
'publication':unicode(self.publication)}
lo cual es útil si tiene muchos argumentos para sustituir (particularmente si está haciendo internacionalización)
Python2.6 en adelante soporta .format()
'{author} in {publication}'.format(author=self.author,
publication=self.publication)
'{} in {}'cadena de formato plano .