Wie erstelle ich eine mehrzeilige Python-Zeichenfolge mit Inline-Variablen?

91

Ich suche nach einer sauberen Möglichkeit, Variablen in einem mehrzeiligen Python-String zu verwenden. Angenommen, ich wollte Folgendes tun:

string1 = go
string2 = now
string3 = great

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

Ich suche nach einer ähnlichen Funktion wie $in Perl, um eine Variable in der Python-Syntax anzugeben.

Wenn nicht - wie kann eine mehrzeilige Zeichenfolge mit Variablen am saubersten erstellt werden?

Evolution
quelle

Antworten:

153

Der übliche Weg ist die format()Funktion:

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

Es funktioniert gut mit einer mehrzeiligen Formatzeichenfolge:

>>> 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.

Sie können auch ein Wörterbuch mit Variablen übergeben:

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

Das, was Sie (in Bezug auf die Syntax) am ehesten gefragt haben, sind Vorlagenzeichenfolgen . Beispielsweise:

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

Ich sollte jedoch hinzufügen, dass die format()Funktion häufiger verwendet wird, da sie leicht verfügbar ist und keine Importzeile erfordert.

Simeon Visser
quelle
2
Könnte vars()oder locals()als das fragliche Wörterbuch verwenden
Ismail Badawi
2
@isbadawi Explizit ist besser als implizit. Übergeben Sie besser nur die Variablen, die Sie benötigen. Wenn Sie nicht wissen, welche Sie benötigen, da die Zeichenfolge vom Benutzer bereitgestellt wird, sollten die "Variablen" dictohnehin Elemente in einer sein.
Agf
Die zweite Lösung ist die sauberste IMO. Das Wörterbuch zusammen mit dem eindeutigen Variablennamen aus dem Wörterbuch innerhalb des mehrzeiligen Stichs. Ich werde diese Methode verwenden. Vielen Dank. Viele tolle Antworten unten, aber das war perfekt.
Evolution
@SimeonVisser, "string" .format (...) ist nicht gültig für ältere Python-Versionen (zB 2.4)
Oz123
Wenn Sie geschweifte Klammern verwenden, müssen Sie wie folgt entkommen {{this}}.
Jonny
51

HINWEIS : Die empfohlene Methode zum Formatieren von Zeichenfolgen in Python ist die Verwendung format(), wie in der akzeptierten Antwort beschrieben . Ich behalte diese Antwort als Beispiel für die C-Syntax bei, die ebenfalls unterstützt wird.

# 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)

Einige lesen:

David Cain
quelle
2
Dies ist nicht wirklich dasselbe, da das OP benannte Parameter und keine Positionsparameter wünscht.
Ismail Badawi
1
Es ist immer noch eine gute Lösung und für eine mehrzeilige Interpolation direkter. Sie müssen nichts importieren und es wird eine regelmäßige Python-Interpolation verwendet.
Unflores
4
" Sie hätten diesen wahrscheinlich mit ein bisschen Googeln beantworten können. " Dies bedeutet, dass wir diesen Beitrag nach dem Googeln nicht gefunden haben ...
Stevoisiak
27

Sie können die F-Strings von Python 3.6 für Variablen in mehrzeiligen oder langen einzeiligen Strings verwenden. Sie können Zeilenumbruchzeichen manuell mit angeben \n.

Variablen in einer mehrzeiligen Zeichenfolge

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)

Ich werde dorthin gehen
Ich werde jetzt
großartig gehen

Variablen in einer langen einzeiligen Zeichenfolge

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

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

print(singleline_string)

Ich werde dorthin gehen. Ich werde jetzt gehen. großartig.


Alternativ können Sie auch einen mehrzeiligen F-String mit dreifachen Anführungszeichen erstellen.

multiline_string = f"""I will {string1} there.
I will go {string2}.
{string3}."""
Stevoisiak
quelle
Dadurch sieht Ihr Quellcode hübsch aus, und in Pre-Python3.6 können Sie den gleichen Effekt erzielen, indem Sie dies tun (zusätzliche Klammern und +Verkettung): stackoverflow.com/a/54564926/4561887
Gabriel Staples
Dreifaches Zitieren wird sehr bevorzugt. Sie sollten dieses Formular zuerst vorlegen.
jpmc26
@ jpmc26 Ich habe zuerst einen Klammerstil vorgestellt, der auf den Richtlinien von PEP 8 für das Einrücken von Code basiert . Warum sollte dreifaches Zitieren bevorzugt werden?
Stevoisiak
10

Das ist, was du willst:

>>> 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
Havok
quelle
Beachten Sie, dass dreifache Anführungszeichen """Zeilenumbrüche beibehalten, was bedeutet, dass es vor und nach dem mystring
Zeilenumbruch
Sie können verwendet werden .strip(), .rstrip()oder .lstrip(), oder ein Spiel innerhalb der dreifachen Anführungszeichen ue zu vermeiden , eine neue Zeile zu erstellen. mystring = "" "\ ABC \" ""
Havok
6

Ein Wörterbuch kann übergeben werden format(). Jeder Schlüsselname wird zu einer Variablen für jeden zugeordneten Wert.

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

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

print(multiline_string)


Es kann auch eine Liste übergeben werden. format()In diesem Fall wird die Indexnummer jedes Werts als Variable verwendet.

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

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

print(multiline_string)


Beide oben genannten Lösungen geben dasselbe aus:

Ich werde dorthin gehen
Ich werde jetzt
großartig gehen

Spaßvogel
quelle
0

Wenn jemand vom Python-Graphql-Client hierher kam und nach einer Lösung suchte, um ein Objekt als Variable zu übergeben, habe ich Folgendes verwendet:

query = """
{{
  pairs(block: {block} first: 200, orderBy: trackedReserveETH, orderDirection: desc) {{
    id
    txCount
    reserveUSD
    trackedReserveETH
    volumeUSD
  }}
}}
""".format(block=''.join(['{number: ', str(block), '}']))

 query = gql(query)

Stellen Sie sicher, dass Sie alle geschweiften Klammern wie ich umgehen: "{{", "}}"

Radu Ciobanu
quelle
0

f-Strings , auch als "formatierte String-Literale" bezeichnet, sind String-Literale, die fam Anfang ein haben. und geschweifte Klammern mit Ausdrücken, die durch ihre Werte ersetzt werden.

f-Strings werden zur Laufzeit ausgewertet.

So kann Ihr Code wie folgt umgeschrieben werden:

string1="go"
string2="now"
string3="great"
print(f"""
I will {string1} there
I will go {string2}
{string3}
""")

Und dies wird bewertet, um:

I will go there
I will go now
great

Mehr dazu erfahren Sie hier .

Anshika Singh
quelle