problème échappement dans une f-string ?

impossible de mentionner une clef de dictionnaire un peu particulière...

Le problème exposé dans ce sujet a été résolu.

Salut !

Voici ce qui peut ressembler à un exercice parfaitement inutile pour ceux qui n’aiment pas se pencher sur la "grammaire" des langages :euh:

Voilà un petit code python (qui marche) :

dico = {'a' : "abricot", 'b, \', ", """' : "banane"}

for clef, val in dico.items():
    print(clef, val, sep = ' : ')

Qui affiche :

a : abricot
b, ', ", """ : banane

Et maintenant voici sa suite qui marche… Moins bien >_<

chaine_banane = f"{dico['b, \', \", \"\"\"']}"

Il semble donc qu’on ne puisse pas échapper avec un backslash entre les placeholders (accolades) d’une f-string ? Une solution en utilisant les f-strings ? Ou suis-je condamné à utiliser une syntaxe avec .format ?

Bonne journée :)

+0 -0

C’est lié au fait que les backslashes ne peuvent pas s’utiliser dans les éléments des f-strings.

À noter que l’échappement deviendra plus simple dans les f-strings à partir de Python 3.12 grâce à la PEP 701.

Salut,

Pour la même raison que tu as échappé les guillemets \" ne devrais-tu pas échapper l’échappement pour le conserver à la résolution de la chaine imbriquée ?
f"{dico['b, \\', \", \"\"\"']}"

romantik

C’est pas une mauvaise idée : print("dico['b, \\', \", \"\"\"']") donne bien une chaine qui contient une expression valide qui va indexer la bonne clé. Mais il suffit d’essayer pour se rendre compte que ceci provoque une

SyntaxError: f-string expression part cannot include a backslash

C’est une limitation actuelle des f-strings qui sera levée avec la PEP 701 mentionnée par entwanne.

Cela dit, on peut se demander si complexifier la syntaxe des f-strings pour permettre ce genre de choses est vraiment une bonne idée. L’interpolation d’expressions arbitraires dans une f-string devient rapidement difficile à lire et prone à des erreurs de syntaxes qui ne sautent pas forcément aux yeux.

Typiquement, la question posée dans le sujet me donne surtout envie de mettre la clé problématique dans une variable pour éviter de se la trainer sous forme littérale (des clés aussi alambiquées sont à éviter de toute façons pour des raisons évidentes de lisibilité).

Merci pour votre aide à tous,

j’écris juste le code suggéré par Adri1 répondant à la question, et qui me paraît être tout à fait dans l’esprit de la question :

chaine_clef = "b, ', \", \"\"\""
print(chaine_clef)
chaine_banane = f"{dico[chaine_clef]}"
print(chaine_banane)

Et ce code affiche :

b, ', ", """
banane

A plus :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte