web-dev-qa-db-fra.com

Existe-t-il un équivalent de Python à l'interpolation de chaîne de Ruby?

Exemple Ruby:

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

La concaténation de chaînes réussie Python m’apparaît comme verbeuse.

317
Caste

Python 3.6 ajoutera interpolation de chaîne littérale similaire à l'interpolation de chaîne de Ruby. À partir de cette version de Python (dont la sortie est prévue pour la fin de 2016), vous pourrez inclure des expressions dans les "chaînes de caractères", par exemple.

_name = "Spongebob Squarepants"
print(f"Who lives in a Pineapple under the sea? {name}.")
_

Avant la version 3.6, le plus proche que vous puissiez obtenir est

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

L'opérateur _%_ peut être utilisé pour interpolation de chaîne en Python. Le premier opérande est la chaîne à interpoler, le second peut avoir différents types, notamment un "mappage", mappant les noms de champs sur les valeurs à interpoler. Ici, j'ai utilisé le dictionnaire des variables locales locals() pour mapper le nom du champ name à sa valeur en tant que variable locale.

Le même code utilisant la méthode .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"))
_
387
Sven Marnach

Depuis Python 2.6.X, vous pouvez utiliser:

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

J'ai développé le package interpy , qui permet l'interpolation de chaînes 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}."
32
Syrus Akbary Nieto

L'interpolation de chaîne va être incluse avec Python 3.6 comme spécifié dans PEP 498 . Vous pourrez faire ceci:

name = 'Spongebob Squarepants'
print(f'Who lives in a Pineapple under the sea? \n{name}')

Notez que je déteste Spongebob, alors écrire a été légèrement douloureux. :)

26
kirbyfan64sos

L'interpolation de chaîne de Python est similaire à printf () de C

Si tu essayes:

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

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

26
Oleiade

Vous pouvez aussi avoir ceci

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

http://docs.python.org/2/library/string.html#formatstrings

4
Quan To
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)

Usage:

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é:

3
Paulo Cheque

Pour l'ancien Python (testé sur la version 2.4), la solution la plus avancée indique le chemin. Tu peux le faire:

import string

def try_interp():
    d = 1
    f = 1.1
    s = "s"
    print string.Template("d: $d f: $f s: $s").substitute(**locals())

try_interp()

Et vous obtenez

d: 1 f: 1.1 s: s
2
Michael Fox

Python 3.6 et les versions plus récentes ont interpolation de chaîne littérale utilisant les chaînes de caractères f:

name='world'
print(f"Hello {name}!")
0
Alejandro Silva