¿Qué hay debajo del capó de x = ‘y’ ‘z’ en Python?

Si ejecuta x = 'y' 'z' en Python, obtendrá 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? ¿Realmente está ejecutando 'y' + 'z' o está ejecutando ''.join('y','z') o algo más?

El analizador de Python interpreta eso como una cadena. Esto está bien documentado en la documentación del Análisis Léxico :

Cadena de concatenacion literal

Se permiten múltiples literales de cadena adyacentes (delimitados por espacios en blanco), posiblemente utilizando diferentes convenciones de comillas, y su significado es el mismo que su concatenación. Por lo tanto, "hello" 'world' es equivalente a "helloworld" .

El código comstackdo de Python solo ve un objeto de 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 mismo acto de construir el AST lo que activa la concatenación, ya que el árbol de análisis se recorre, vea la función parsestrplus() en la fuente AST C.

La función está dirigida específicamente a reducir la necesidad de barras invertidas; utilícelo 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.') 

Múltiples líneas físicas se pueden unir implícitamente en una línea física utilizando paréntesis, corchetes o llaves.

Esta función de concatenación de cadenas se copió de C, pero Guido van Rossum está en el registro lamentando haberla agregado a Python . Esa publicación dio inicio a un hilo largo y muy interesante, con mucho apoyo para eliminar la característica por completo.

Las cadenas están siendo concatenadas por el analizador de Python antes de que se ejecute algo, por lo que no es como 'y' + 'z' o ''.join('y','z') , excepto que tiene el mismo efecto.