¿Por qué f '{{{74}}}' es lo mismo que f '{{74}}' con f-Strings?

109

Las cadenas f están disponibles en Python 3.6 y son muy útiles para formatear cadenas:

>>> n='you'
>>> f'hello {n}, how are you?'
'hello you, how are you?'

Leer más sobre ellos en las f-Strings de Python 3: una sintaxis de formato de cadena mejorada (Guía) . Encontré un patrón interesante:

Tenga en cuenta que el uso de llaves triples dará como resultado que solo haya llaves simples en su cadena:

>>> f"{{{74}}}"
'{74}'

Sin embargo, puede obtener más llaves para mostrar si usa más de llaves triples:

>>> f"{{{{74}}}}"
'{{74}}'

Y este es exactamente el caso:

>>> f'{74}'
'74'

>>> f'{{74}}'
'{74}'

Ahora si pasamos de dos {a tres, el resultado es el mismo:

>>> f'{{{74}}}'
'{74}'           # same as f'{{74}}' !

¡Entonces necesitamos hasta 4! ( {{{{) para obtener dos llaves como salida:

>>> f'{{{{74}}}}'
'{{74}}'

¿Por qué es esto? ¿Qué sucede con dos llaves para que Python requiera una extra a partir de ese momento?

fedorqui 'así que deja de dañar'
fuente
70
Puede ser esclarecedor comparar las salidas de f"{{2+2}}"y f"{{{2+2}}}", que son '{2+2}'y '{4}'respectivamente
Kevin
3
@ Kevin genial. Es curioso cómo f'{2+2}'devuelve 4, f'{{2+2}}'devuelve 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} y así sucesivamente. Tiene sentido, pero se desconcierta un poco a primera vista.
fedorqui 'SO deja de dañar'
2
En pocas palabras, es porque f'{74}'es lo mismo que f'74'.
kaya3
1
Esto no es nada nuevo con f-strings, lo bueno str.formattambién lo hace.
Peilonrayz
@Peilonrayz ¿Cómo? "{74}".format(...)requeriría una secuencia con al menos 74 elementos.
gerrit

Respuestas:

118

Las llaves dobles escapan de las llaves, para que no ocurra interpolación: {{{y }}} . Y 74sigue siendo una cadena sin cambios, '74'.

Con llaves dobles, las llaves dobles exteriores se escapan, igual que arriba. Las llaves internas, por otro lado, conducen a una interpolación regular de cadenas del valor 74.

Es decir, la cadena f'{{{74}}}'es equivalente af'{{ {74} }}' , pero sin espacios (o, equivalentemente, a '{' + f'{74}' + '}').

Puede ver la diferencia al reemplazar la constante numérica por una variable:

In [1]: x = 74

In [2]: f'{{x}}'
Out[2]: '{x}'

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Konrad Rudolph
fuente