J'ai une chaîne qui ressemble '%s in %s'
et je veux savoir comment séparer les arguments pour qu'ils soient deux% s différents. Mon esprit venant de Java est venu avec ceci:
'%s in %s' % unicode(self.author), unicode(self.publication)
Mais cela ne fonctionne pas alors à quoi cela ressemble-t-il en Python?
'{} in {}'
chaîne de format simple .Si vous utilisez plus d'un argument, il doit être dans un tuple (notez les parenthèses supplémentaires):
Comme le souligne EOL, la
unicode()
fonction suppose généralement le codage ascii par défaut, donc si vous avez des caractères non ASCII, il est plus sûr de passer explicitement le codage:Et à partir de Python 3.0, il est préférable d'utiliser la
str.format()
syntaxe à la place:la source
Sur un tuple / objet de mappage pour plusieurs arguments
format
Ce qui suit est extrait de la documentation:
Références
Activé
str.format
au lieu de%
Une alternative plus récente à l'
%
opérateur est d'utiliserstr.format
. Voici un extrait de la documentation:Références
str.format
- syntaxeExemples
Voici quelques exemples d'utilisation:
Voir également
la source
'{self.author} in {self.publication}'.format(self=self)
devrait "fonctionner". Je ne suis tout simplement pas sûr de toutunicode
.{first[0]}
pour obtenir l'initialeJ
.Vous devez simplement mettre les valeurs entre parenthèses:
Ici, pour le premier
%s
leunicode(self.author)
sera placé. Et pour le second%s
, leunicode(self.publication)
sera utilisé.la source
%s
plutôt alorsformat
Il y a un problème important avec certaines des réponses publiées jusqu'à présent:
unicode()
décode à partir de l'encodage par défaut, qui est souvent ASCII; en fait,unicode()
essaie de donner un «sens» aux octets qui lui sont donnés en les convertissant en caractères. Ainsi, le code suivant, qui est essentiellement ce qui est recommandé par les réponses précédentes, échoue sur ma machine:donne:
L'échec vient du fait qu'il
author
ne contient pas que des octets ASCII (c'est-à-dire avec des valeurs entre [0; 127]), etunicode()
décode de l'ASCII par défaut (sur de nombreuses machines).Une solution robuste est de donner explicitement l'encodage utilisé dans vos champs; en prenant UTF-8 comme exemple:
(ou sans l'initiale
u
, selon que vous voulez un résultat Unicode ou une chaîne d'octets).À ce stade, vous pouvez envisager de faire en sorte que les champs
author
etpublication
soient des chaînes Unicode, au lieu de les décoder lors du formatage.la source
Pour python2, vous pouvez également le faire
ce qui est pratique si vous avez beaucoup d'arguments à substituer (surtout si vous faites de l'internationalisation)
Prise en charge de Python2.6 et versions ultérieures
.format()
la source
Vous pouvez également l'utiliser propre et simple (mais faux! Car vous devriez l'utiliser
format
comme Mark Byers l'a dit) en faisant:la source
Par souci d'exhaustivité, en python 3.6, des f-string sont introduites dans PEP-498 . Ces chaînes permettent de
Cela signifierait que pour votre exemple, vous pourriez également utiliser:
la source