Curiosidades sobre los literales de cadena en Python: comillas, barras invertidas y f-strings

Fuentes: Python string literals are kinda funny

El lenguaje Python trata los literales de cadena con una lógica que puede resultar sorprendente. En un prefijo de cadena sin procesar, indicado con la letra r, los caracteres de barra invertida no se interpretan como escapes, pero la cadena sigue analizándose léxicamente como una cadena normal, por lo que no puede terminar en barra invertida: el lexer asume que la comilla siguiente forma parte de la secuencia escapada, aunque en realidad no lo esté. Esta limitación, heredada de decisiones de implementación del propio lenguaje, provoca que escribir r'asdf\' sea un error de sintaxis, mientras que r'asdf\'' sí sea válido y produzca la cadena asdf.

Las f-strings, introducidas en Python 3.6, llevan esta idea más lejos. Todo lo que aparece entre sus llaves se procesa con un analizador sintáctico completo, por lo que puede contener comillas, comentarios y extenderse en varias líneas. La expresión termina únicamente con una llave de cierre, un signo de exclamación o dos puntos que no estén dentro de paréntesis o comentarios. Precisamente por eso, las expresiones lambda y las expresiones de asignación deben ir entre paréntesis dentro de una f-string, ya que ambas podrían contener un signo de cierre.

Estas peculiaridades, lejos de ser simples rarezas, muestran cómo pequeñas decisiones de diseño del lexer y del parser condicionan la sintaxis cotidiana que utilizan los programadores de Python.