363 votes

Interpolation de chaînes de caractères en Python

Existe-t-il un équivalent Python de l'interpolation de chaînes de caractères de Ruby ?

Exemple de Ruby :

name = "Spongebob Squarepants"
puts "Who lives in a Pineapple under the sea? \n#{name}."

Alors que je pourrais réussir à utiliser la concaténation de chaînes de caractères en Python, cela me semble bien verbeux quand je viens de Ruby.

Mise à jour : Le problème a été résolu en utilisant le .format que l'on trouve dans Python 2.6 et plus. Ce n'est cependant pas la seule méthode. D'autres sont a expliqué de manière éloquente par Sven Marnach .

Un exemple (merci à EinLama ) :

"my {0} string: {1}".format("cool", "Hello there!")

Sortie :

'my cool string: Hello there!"

2 votes

Le problème ici est que name est une variable locale se trouvant dans la chaîne, et en Python vous devez explicitement passer le dictionnaire des variables locales au formateur de chaîne si vous voulez qu'il les utilise.

0 votes

Ce n'était pas le problème initial, mais merci. Votre commentaire m'a permis de mieux comprendre la portée des variables (un sujet sur lequel j'ai encore des progrès à faire) :)

1 votes

Que pensez-vous de celui-ci ? stackoverflow.com/questions/16504732/

437voto

Sven Marnach Points 133943

Le plus proche que vous puissiez obtenir est

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? %(name)s." % locals()

Le site % L'opérateur peut être utilisé pour interpolation de chaînes de caractères en Python. Le premier opérande est la chaîne de caractères à interpoler, le second peut avoir différents types dont un "mapping", faisant correspondre les noms de champs aux valeurs à interpoler. Ici, j'ai utilisé le dictionnaire des variables locales locals() pour faire correspondre le nom du champ name à sa valeur en tant que variable locale.

[Edit : Le même code utilisant le .format() des versions récentes de Python ressemblerait à ceci :

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? {name!s}.".format(**locals())

]

Il y a aussi le string.Template classe :

tmpl = string.Template("Who lives in a Pineapple under the sea? $name.")
print tmpl.substitute(name="Spongebob Squarepants")

0 votes

@Caste voir ici : docs.python.org/library/stdtypes.html#string-formatting et postez un commentaire de suivi si vous avez besoin de plus de détails.

0 votes

J'en comprends l'essentiel, mais pas tous les symboles et textes supplémentaires figurant dans l'exemple de la documentation. Pourquoi l'utilisation de convert to string ici ? %(language)s Que signifie le 3 dans '03d' ? Pourquoi y a-t-il un % après la chaîne de caractères ? L'affectation des variables (s'il s'agit bien de variables) après l'expression imprimée me trouble aussi. Désolé si c'est un problème !

1 votes

Les deux formats de base utilisés dans l'exemple sont %s pour une chaîne de caractères et %03d pour un nombre à 3 chiffres avec des zéros en tête. On pourrait simplement écrire print "%s has %03d" % ("Python", 2) . L'exemple fait ensuite appel à la mise entre parenthèses d'une clé de mappage après la balise % ce qui est un moyen de donner aux caractères de remplacement des noms significatifs plutôt que de se fier à leur ordre dans la chaîne. Vous passez ensuite un dictionnaire qui fait correspondre les noms des clés à leurs valeurs. C'est pourquoi Sven utilise la méthode locals() qui renvoie un dict contenant toutes vos variables locales, de sorte qu'il correspondra à la fonction name à la valeur du nom

151voto

EinLama Points 566

Depuis Python 2.6.X, vous pouvez utiliser :

"my {0} string: {1}".format("cool", "Hello there!")

Cela vaut doublement pour Python 3.X, où la syntaxe % est dépréciée.

27 votes

Notez que le % L'opérateur pour l'interpolation de chaînes de caractères est pas déprécié dans Python 3.x. docs.python.org/dev/py3k/whatsnew/ annonce le projet de dépréciation % à partir de la version 3.1, mais cela ne s'est jamais produit.

8 votes

La syntaxe % est toujours d'actualité dans Python 3 (elle n'est plus dépréciée depuis Python 3.2).

10 votes

Juste une remarque : le nombre dans {} peuvent être éliminés.

32voto

J'ai développé le interpy que permet l'interpolation de chaînes de caractères en Python .

Il suffit de l'installer via pip install interpy . Et ensuite, ajoutez la ligne # coding: interpy au début de vos fichiers !

Exemple :

#!/usr/bin/env python
# coding: interpy

name = "Spongebob Squarepants"
print "Who lives in a Pineapple under the sea? \n#{name}."

4 votes

Cela semble vraiment peu sûr.

0 votes

@d33tah : Non, tant que les chaînes de caractères sont connues au moment de la compilation.

29voto

Oleiade Points 1472

L'interpolation de chaînes de caractères de Python est similaire à printf() en C.

Si vous essayez :

name = "SpongeBob Squarepants"
print "Who lives in a Pineapple under the sea? %s" % name

L'étiquette %s sera remplacé par le name variable. Vous devriez jeter un coup d'œil aux balises de la fonction d'impression : http://docs.python.org/library/functions.html

1 votes

Comment faire avec 2 variables ?

17 votes

@JulioMarins Utilisez un tuple : print "First is %s, second is %s" % (var1, var2) .

3voto

Paulo Cheque Points 335
import inspect
def s(template, **kwargs):
    "Usage: s(string, **locals())"
    if not kwargs:
        frame = inspect.currentframe()
        try:
            kwargs = frame.f_back.f_locals
        finally:
            del frame
        if not kwargs:
            kwargs = globals()
    return template.format(**kwargs)

Utilisation :

a = 123
s('{a}', locals()) # print '123'
s('{a}') # it is equal to the above statement: print '123'
s('{b}') # raise an KeyError: b variable not found

PS : la performance peut être un problème. Ceci est utile pour les scripts locaux, pas pour les journaux de production.

Dupliqué :

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