web-dev-qa-db-fra.com

Pourquoi f '{{{74}}}' est-il le même que f '{{74}}' avec f-Strings?

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 sur eux 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 avoir Python nécessite un supplémentaire à partir de ce moment?

108

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

Avec les triple croisillons, les doubles croisillons extérieurs sont échappés, 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}}}' est équivalent à 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}'
117
Konrad Rudolph