Tengo una cadena que se parece '%s in %s'
y quiero saber cómo separar los argumentos para que sean dos% s diferentes. Mi mente proveniente de Java surgió con esto:
'%s in %s' % unicode(self.author), unicode(self.publication)
Pero esto no funciona, ¿cómo se ve en Python?
'{} in {}'
cadena de formato plano .Si está utilizando más de un argumento, debe estar en una tupla (tenga en cuenta los paréntesis adicionales):
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:Y a partir de Python 3.0, se prefiere usar la
str.format()
sintaxis en su lugar:fuente
En un objeto tuple / mapping para argumento múltiple
format
Lo siguiente es un extracto de la documentación:
Referencias
En
str.format
lugar de%
Una alternativa más nueva al
%
operador es usarstr.format
. Aquí hay un extracto de la documentación:Referencias
str.format
- sintaxisEjemplos
Aquí hay algunos ejemplos de uso:
Ver también
fuente
'{self.author} in {self.publication}'.format(self=self)
"debería funcionar". Simplemente no estoy seguro de todo elunicode
asunto.{first[0]}
para obtener la inicialJ
.Solo debes poner los valores entre paréntesis:
Aquí, por primera
%s
elunicode(self.author)
será colocado. Y para el segundo%s
,unicode(self.publication)
se utilizará el.fuente
%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:da:
La falla proviene del hecho de que
author
no contiene solo bytes ASCII (es decir, con valores en [0; 127]), yunicode()
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:
(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
ypublication
como cadenas Unicode, en lugar de decodificarlos durante el formateo.fuente
Para python2 también puedes hacer esto
lo cual es útil si tiene muchos argumentos para sustituir (particularmente si está haciendo internacionalización)
Python2.6 en adelante soporta
.format()
fuente
También puede usarlo limpio y simple (¡pero incorrecto! Porque debe usarlo
format
como dijo Mark Byers) haciendo:fuente
Para completar, en Python 3.6 se introducen f-string en PEP-498 . Estas cadenas hacen posible
Eso significaría que para su ejemplo también podría usar:
fuente