web-dev-qa-db-fra.com

Comment créer une chaîne multiligne Python avec des variables en ligne?

Je cherche un moyen propre d’utiliser des variables dans une multiligne Python chaîne. Disons que je voulais faire ce qui suit:

string1 = go
string2 = now
string3 = great

"""
I will $string1 there
I will go $string2
$string3
"""

Je cherche à voir s'il y a quelque chose de similaire à $ en Perl pour indiquer une variable dans la syntaxe Python.

Sinon, quel est le moyen le plus propre de créer une chaîne multiligne avec des variables?

73
evolution

La manière courante est la fonction format():

>>> s = "This is an {example} with {vars}".format(vars="variables", example="example")
>>> s
'This is an example with variables'

Cela fonctionne très bien avec une chaîne de format multiligne:

>>> s = '''\
... This is a {length} example.
... Here is a {ordinal} line.\
... '''.format(length='multi-line', ordinal='second')
>>> print(s)
This is a multi-line example.
Here is a second line.

Vous pouvez également passer un dictionnaire avec des variables:

>>> d = { 'vars': "variables", 'example': "example" }
>>> s = "This is an {example} with {vars}"
>>> s.format(**d)
'This is an example with variables'

La chose la plus proche de ce que vous avez demandé (en termes de syntaxe) est chaînes de modèle . Par exemple:

>>> from string import Template
>>> t = Template("This is an $example with $vars")
>>> t.substitute({ 'example': "example", 'vars': "variables"})
'This is an example with variables'

J'ajouterais cependant que la fonction format() est plus courante car elle est facilement disponible et ne nécessite pas de ligne d'importation.

116
Simeon Visser

[~ # ~] note [~ # ~] : la méthode recommandée pour formater une chaîne en Python est de use format(), comme indiqué dans la réponse acceptée . Je conserve cette réponse comme exemple de syntaxe de style C également prise en charge.

# NOTE: format() is a better choice!
string1 = "go"
string2 = "now"
string3 = "great"

s = """
I will %s there
I will go %s
%s
""" % (string1, string2, string3)

print(s)

Quelques lectures:

45
David Cain

Vous pouvez utiliser chaînes de caractères de Python 3.6 pour les variables à l'intérieur de multiligne ou de longues chaînes à une seule ligne. Vous pouvez spécifier manuellement les caractères de nouvelle ligne à l'aide de \n.

Variables dans une chaîne multiligne

string1 = "go"
string2 = "now"
string3 = "great"

multiline_string = (f"I will {string1} there\n"
                    f"I will go {string2}.\n"
                    f"{string3}.")

print(multiline_string)

Je vais y aller
Je vais y aller maintenant
génial

Variables dans une longue chaîne d'une seule ligne

string1 = "go"
string2 = "now"
string3 = "great"

singleline_string = (f"I will {string1} there. "
                     f"I will go {string2}. "
                     f"{string3}.")

print(singleline_string)

Je vais y aller. Je vais y aller maintenant. génial.


Vous pouvez également créer une chaîne f multiligne avec des guillemets triples.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""
19
Stevoisiak

Voici ce que tu veux:

>>> string1 = "go"
>>> string2 = "now"
>>> string3 = "great"
>>> mystring = """
... I will {string1} there
... I will go {string2}
... {string3}
... """
>>> locals()
{'__builtins__': <module '__builtin__' (built-in)>, 'string3': 'great', '__package__': None, 'mystring': "\nI will {string1} there\nI will go {string2}\n{string3}\n", '__name__': '__main__', 'string2': 'now', '__doc__': None, 'string1': 'go'}
>>> print(mystring.format(**locals()))

I will go there
I will go now
great
7
Havok

Un dictionnaire peut être passé à format() , chaque nom de clé deviendra une variable pour chaque valeur associée.

dict = {'string1': 'go',
        'string2': 'now',
        'string3': 'great'}

multiline_string = '''I'm will {string1} there
I will go {string2}
{string3}'''.format(**dict)

print(multiline_string)


Une liste peut également être passée à format() , le numéro d'index de chaque valeur sera utilisé comme variable dans ce cas.

list = ['go',
        'now',
        'great']

multiline_string = '''I'm will {0} there
I will go {1}
{2}'''.format(*list)

print(multiline_string)


Les deux solutions ci-dessus donneront le même résultat:

Je vais y aller
Je vais y aller maintenant
génial

6
jesterjunk