web-dev-qa-db-fra.com

Puis-je importer les littéraux de chaîne formatés (chaînes f) de Python 3.6 dans des versions plus anciennes de Python 3.x, 2.x?

Les nouvelles cordes f Python 3.6 me paraissent être une avancée considérable en termes d’utilisabilité des cordes, et j’aimerais bien les adopter et les adopter de tout cœur pour les nouveaux projets pouvant tourner sur des interprètes plus anciens. La prise en charge des versions 2.7, 3.3-3.5 serait formidable, mais au minimum, j'aimerais les utiliser dans les bases de code Python 3.5. Comment puis-je importer les littéraux de chaîne formatés 3.6 pour une utilisation par des interprètes plus anciens?

Je comprends que les littéraux de chaîne formatés tels que f"Foo is {age} {units} old" ne cassent pas les modifications et ne seraient donc pas inclus dans un appel from __future__ import .... Mais le changement n'est pas rétroporté (autant que je sache), je dois être sûr que le nouveau code que j'écris avec f-strings n'est exécuté que sur Python 3.6+, ce qui est un facteur décisif pour de nombreux projets.

28
zachd1_618

Malheureusement si vous voulez l'utiliser, vous devez utiliser Python 3.6+, de même que l'opérateur de multiplication de matrice @ et Python 3.5+ ou yield from (Python 3.4+ je pense)

Celles-ci ont modifié la façon dont le code est interprété et génèrent donc SyntaxErrors lors de leur importation dans des versions plus anciennes. Cela signifie que vous devez les placer à un endroit où ils ne sont pas importés dans des Pythons plus anciens ou protégés par un eval ou exec (je ne recommanderais pas ces deux derniers!).

Donc oui, vous avez raison, si vous voulez supporter plusieurs versions de Python, vous ne pouvez pas les utiliser facilement.

12
MSeifert

future-fstrings apporte les chaînes de caractères aux scripts Python 2.7. (Et je suppose que 3.3-3.5 sur la base de la documentation.)

Une fois que vous l'avez installé via pip install future-fstrings, vous devez placer une ligne spéciale en haut de votre code. Cette ligne est:

# -*- coding: future_fstrings -*-

Ensuite, vous pouvez utiliser des littéraux de chaîne formatés (chaînes f) dans votre code:

# -*- coding: future_fstrings -*-
var = 'f-string'
print(f'hello world, this is an {var}')
24
Wayne

voici ce que j'utilise:

text = "Foo is {age} {units} old".format(**locals())

il décompresse (**) le dict renvoyé par locals() qui contient toutes vos variables locales sous forme de dict {variable_name: value}

Remarque cela ne fonctionnera pas pour les variables déclarées dans une étendue externe, sauf si vous l'importez dans l'étendue locale avec nonlocal (Python 3.0+).

vous pouvez aussi utiliser

text.format(**locals(),**globals())

d'inclure des variables globales dans votre chaîne.

8
Yoily L

Les chaînes de caractères f sont créées par l’interprète lors de l’ajout du préfixe f - cette fonctionnalité à elle seule éliminera toute chance de compatibilité.

Votre tir le plus proche consiste à utiliser le format de mot-clé, comme 

'Foo is {age} {units} old'.format(age=age, units=units)

qui peut être plus facilement refactorisé dès la fin de l'exigence de compatibilité. 

4
Uriel