2012-04-11 27 views
46

Estoy buscando una manera limpia de usar variables dentro de una cadena de Python de líneas múltiples. Decir que quería hacer lo siguiente:¿Cómo creo una cadena de Python de líneas múltiples con variables en línea?

string1 = go 
string2 = now 
string3 = great 

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

Estoy mirando para ver si hay algo similar a $ en Perl para indicar una variable en la sintaxis de Python.

Si no, ¿cuál es la forma más limpia de crear una cadena multilínea con variables?

Respuesta

70

La forma más común es la función format():

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

También se puede pasar un diccionario con variables:

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

Lo más parecido a lo que pidió (en términos de sintaxis) son template strings. Por ejemplo:

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

aunque debo añadir que la función format() es más común porque es fácilmente disponible y que no requiere una línea de importación.

+2

Podría usar 'vars()' o 'locals()' como el diccionario en pregunta –

+2

@isbadawi Explícito es mejor que implícito. Mejor pasar solo las variables que necesita. Si no sabes cuál es el que necesitas, porque la cadena la proporciona el usuario, las "variables" deben ser ítems en un 'dict' de todos modos. – agf

+0

La segunda solución es la OMI más limpia. El diccionario junto con el nombre claro de la variable del diccionario dentro de la picada multilínea. Usaré este método. Gracias. Un montón de excelentes respuestas también, pero esto fue perfecto. – evolution

32

Probablemente podría haber respondido a esto con un poco de Google, pero aquí está el código que estaba buscando. Tenga en cuenta que he corregido su sintaxis en cadenas.

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

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

print s 

Algunos leyendo para aprender más sobre Python cadena de formato:

+2

Esto no es realmente lo mismo porque el PO quiere parámetros con nombre, no los posicionales. –

+0

Ah, jou. ¡Mi error! –

+0

Sigue siendo una buena solución, y para una interpolación de líneas múltiples es más directo. No tiene que importar nada y utiliza la interpolación normal de Python. – unflores

4

eso lo que quiere:

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

I'm will go there 
I will go now 
great 
+0

Tenga en cuenta que las comillas triples '" "" 'conservan las líneas nuevas, lo que significa que hay una nueva línea adicional antes y después de' mystring ' –

+0

Puede usar' '.strip()' ',' '.rstrip()' 'o' '.lstrip()' ', o es una reacción dentro de las comillas triples para evitar crear una nueva línea. mystring = "" "\ ABC \ " "" – Havok

3

Un diccionario se puede pasar a format(), cada nombre de clave se convertirá en una variable para cada valor asociado.

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

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

print(multiline_string) 


también una lista se puede pasar a format(), el número de índice de cada valor se utilizará como variables en este caso.

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

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

print(multiline_string) 


Ambas soluciones anteriores dará salida a los mismos:

estoy va a ir allí
voy a entrar ahora
gran

2

creo que la respuesta anterior Olvidé el {}:

from string import Template 

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

Puede usar Python 3.6's f-strings para variables dentro de multi-line o cadenas largas de una sola línea.

variables en una cadena de múltiples líneas

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

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

print(multiline_string) 

voy a ir allí
voy a ir ahora
grandes

variables en una cadena de una sola línea larga

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

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

print(singleline_string) 

Iré allí. Iré ahora. estupendo.


Alternativamente, para una cadena de múltiples líneas también se puede utilizar () y \n

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