Respuestas:
La respuesta de Mark Cidade es correcta: debe proporcionar una tupla.
Sin embargo, desde Python 2.6 en adelante puede usar en format
lugar 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'))
format
Lo siguiente es un extracto de la documentación:
Dado
format % values
,%
las especificaciones de conversión enformat
se reemplazan con cero o más elementos devalues
. El efecto es similar al usosprintf()
en el lenguaje C.Si
format
requiere 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 laformat
cadena , o un solo objeto de mapeo (por ejemplo, un diccionario).
str.format
lugar 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 unicode
asunto.
{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 %s
el unicode(self.author)
será colocado. Y para el segundo %s
, unicode(self.publication)
se utilizará el.
Nota: debe favorecer
string formatting
sobre la%
notación. Más información aquí.
%s
lugar 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 author
no 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 author
y publication
como 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 .