concatenate - string python 3
¿Qué hay bajo el capó de x=''y'' ''z'' en Python? (2)
Si ejecuta x = ''y'' ''z''
en Python, obtiene x
establecido en ''yz''
, lo que significa que se está produciendo algún tipo de concatenación de cadenas cuando Python ve múltiples cadenas una al lado de la otra.
Pero, ¿qué tipo de concatenación es esta? ¿Se está ejecutando ''y'' + ''z''
o está ejecutando ''''.join(''y'',''z'')
o algo más?
El analizador de Python lo interpreta como una cadena. Esto está bien documentado en la documentación de Análisis Léxico :
Concatenación literal de cadenas
Se permiten múltiples literales de cadena adyacentes (delimitados por espacios en blanco), posiblemente utilizando diferentes convenciones de cotización, y su significado es el mismo que su concatenación. Por lo tanto,
"hello" ''world''
es equivalente a"helloworld"
.
El código Python compilado ve solo el objeto de una cadena; Puedes ver esto pidiéndole a Python que produzca un AST de tales cadenas:
>>> import ast
>>> ast.dump(ast.parse("''hello'' ''world''", mode=''eval'').body)
"Str(s=''helloworld'')"
De hecho, es el acto mismo de construir el AST el que desencadena la concatenación, a medida que el árbol de análisis sintáctico se atraviesa, vea la función parsestrplus()
en la fuente AST C.
La función está específicamente dirigida a reducir la necesidad de barras invertidas; úsalo para dividir una cadena en líneas físicas cuando aún esté dentro de una línea lógica :
print(''Hello world!'', ''This string is spans just one ''
''logical line but is broken across multiple physical ''
''source lines.'')
Varias líneas físicas se pueden unir implícitamente en una línea física mediante el uso de paréntesis, corchetes o llaves.
Esta característica de concatenación de cadenas se copió de C, pero Guido van Rossum lamenta profundamente haberla agregado a Python . Esa publicación dio un puntapié a un hilo largo y muy interesante, con mucho apoyo para eliminar la función por completo.
Las cadenas están siendo concatenadas por el analizador de Python antes de ejecutar cualquier cosa, por lo que no es realmente como ''y'' + ''z''
o ''''.join(''y'',''z'')
, excepto que tiene el mismo efecto.