Pourquoi f '{{{74}}}' est-il identique à f '{{74}}' avec f-Strings?

109

Les f-Strings sont disponibles à partir de Python 3.6 et sont très utiles pour formater les chaînes:

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

En savoir plus à leur sujet dans f-Strings de Python 3: une syntaxe de formatage de chaîne améliorée (Guide) . J'ai trouvé un modèle intéressant:

Notez que l'utilisation d'accolades triples entraînera la présence d'accolades simples dans votre chaîne:

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

Cependant, vous pouvez obtenir plus d'accolades à afficher si vous utilisez plus de trois accolades:

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

Et c'est exactement le cas:

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

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

Maintenant, si nous passons de deux {à trois, le résultat est le même:

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

Il nous faut donc jusqu'à 4! ( {{{{) pour obtenir deux accolades en sortie:

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

Pourquoi est-ce? Que se passe-t-il avec deux accolades pour que Python en ait besoin d'un supplémentaire à partir de ce moment?

fedorqui 'SO arrête de nuire'
la source
70
Il peut être éclairant de comparer les sorties de f"{{2+2}}"et f"{{{2+2}}}", qui sont '{2+2}'et '{4}'respectivement
Kevin
3
@Kevin great one. C'est drôle comment f'{2+2}'renvoie 4, f'{{2+2}}'renvoie 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} et ainsi de suite. Cela a du sens mais laisse un peu perplexe à première vue.
fedorqui 'SO arrêtez de nuire'
2
En termes simples, c'est parce que f'{74}'c'est la même chose que f'74'.
kaya3
1
Ce n'est pas quelque chose de nouveau avec les cordes f, le bon vieux le str.formatfait aussi.
Peilonrayz
@Peilonrayz Comment? "{74}".format(...)nécessiterait une séquence d'au moins 74 éléments.
gerrit

Réponses:

118

Les accolades doubles échappent aux accolades, de sorte qu'aucune interpolation ne se produit: {{{et }}}. Et 74reste une chaîne inchangée, '74'.

Avec les croisillons triples, les doubles croisillons extérieurs s'échappent, comme ci-dessus. Les accolades internes, d'autre part, conduisent à une interpolation de chaîne régulière de la valeur 74.

Autrement dit, la chaîne f'{{{74}}}'équivaut à f'{{ {74} }}', mais sans espaces (ou, de manière équivalente, à '{' + f'{74}' + '}').

Vous pouvez voir la différence lors du remplacement de la constante numérique par une variable:

In [1]: x = 74

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

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