205 votes

À l'aide de plusieurs arguments pour la mise en forme de chaîne en Python (par exemple, "%s ... %s')

J'ai une chaîne qui ressemble '%s in %s' et je veux savoir comment faire pour séparer les arguments de sorte qu'ils sont deux différents %s. Mon esprit venant de Java est venu à ceci:

'%s in %s' % unicode(self.author),  unicode(self.publication)

Mais cela ne fonctionne pas alors comment est-il en Python?

225voto

Mark Byers Points 318575

Marque Cidade de réponse est de droite vous avez besoin de fournir un n-uplet.

Cependant à partir de la version 2.6 de Python, vous pouvez utiliser format au lieu de %:

'{0} in {1}'.format(unicode(self.author,'utf-8'),  unicode(self.publication,'utf-8'))

L'utilisation de % pour les chaînes de mise en forme n'est plus encouragée.

Cette méthode de chaîne de formatage est la nouvelle norme en Python 3.0, et doit être préféré à la % mise en forme décrite dans la Chaîne de Formatage dans le nouveau code.

144voto

Mark Cidade Points 53945

Si vous utilisez plus d'un argument, il doit être dans un tuple (note supplémentaires entre parenthèses):

'%s in %s' % (unicode(self.author),  unicode(self.publication))

Comme EOL souligne, l' 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 transmettre explicitement l'encodage:

'%s in %s' % (unicode(self.author,'utf-8'),  unicode(self.publication('utf-8')))

Et comme de Python 3.0, il est préférable d'utiliser l' str.format() syntaxe:

'{0} in {1}'.format(unicode(self.author,'utf-8'),unicode(self.publication,'utf-8'))

70voto

polygenelubricants Points 136838

Sur un tuple/mapping objet pour plusieurs argument format

Ce qui suit est extrait de la documentation:

Compte tenu de format % values, % spécifications de conversion en format sont remplacées par zéro ou plusieurs éléments de values. L'effet est similaire à l'aide d' sprintf() dans le langage C.

Si format nécessite qu'un seul argument, les valeurs peuvent être un non-objet de tuple. Sinon, les valeurs doivent être un tuple avec exactement le nombre d'éléments spécifiés par l' format chaîne de caractères, ou un simple objet de mappage (par exemple, un dictionnaire).

Références


Sur str.format au lieu de %

Une nouvelle alternative à l' % de l'opérateur est d'utiliser str.format. Voici un extrait de la documentation:

str.format(*args, **kwargs)

Effectuer une mise en forme de chaîne de l'opération. La chaîne sur laquelle cette méthode est appelée peut contenir du texte littéral ou le remplacement champs sont délimités par des accolades {}. Chaque champ de remplacement contient l'index numérique de position argument, ou le nom d'un argument mot-clé. Renvoie une copie de la chaîne où chaque champ de remplacement est remplacé par la chaîne de valeur de l'argument correspondant.

Cette méthode est la nouvelle norme en Python 3.0, et doit être préféré à l' % mise en forme.

Références


Exemples

Voici quelques exemples d'utilisation:

>>> '%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

Voir aussi

9voto

EOL Points 24342

Il y a un sérieux problème avec certaines des réponses postées jusqu'à présent: unicode() décode de l'encodage par défaut, qui est souvent ASCII; en fait, unicode() tente de faire du "sens" les octets qu'il est donné par la conversion en personnages. Ainsi, le code suivant, qui est essentiellement ce qui est recommandé par les réponses précédentes, échoue sur ma machine:

# -*- coding: utf-8 -*-
author = 'éric'
print '{0}'.format(unicode(author))

donne:

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)

L'échec vient du fait qu' author ne contient pas uniquement les octets ASCII (c'est à dire à valeurs dans [0; 127]), et unicode() décode du ASCII par défaut (sur la plupart des machines).

Une solution robuste est de donner explicitement l'encodage utilisé dans vos champs; la prise en UTF-8 comme exemple:

u'{0} in {1}'.format(unicode(self.author, 'utf-8'), unicode(self.publication, 'utf-8'))

(ou sans le u, selon que vous souhaitez une Unicode résultat ou une chaîne d'octets).

À ce stade, on peut vouloir envisager d'avoir l' author et publication des champs de chaînes Unicode, au lieu de les décoder pendant le formatage.

8voto

gnibbler Points 103484

Pour python2 vous pouvez également le faire

'%(author)s in %(publication)s'%{'author':unicode(self.author),
                                  'publication':unicode(self.publication)}

ce qui est pratique si vous avez beaucoup d'arguments à remplacer (surtout si vous faites de l'internationalisation)

Python2.6 à partir de soutient .format()

'{author} in {publication}'.format(author=self.author,
                                   publication=self.publication)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X