Python a au moins six façons de formater une chaîne:
In [1]: world = "Earth"
# method 1a
In [2]: "Hello, %s" % world
Out[2]: 'Hello, Earth'
# method 1b
In [3]: "Hello, %(planet)s" % {"planet": world}
Out[3]: 'Hello, Earth'
# method 2a
In [4]: "Hello, {0}".format(world)
Out[4]: 'Hello, Earth'
# method 2b
In [5]: "Hello, {planet}".format(planet=world)
Out[5]: 'Hello, Earth'
# method 2c
In [6]: f"Hello, {world}"
Out[6]: 'Hello, Earth'
In [7]: from string import Template
# method 3
In [8]: Template("Hello, $planet").substitute(planet=world)
Out[8]: 'Hello, Earth'
Un bref historique des différentes méthodes:
printf
-le formatage de style existe depuis l'enfance des Pythons- La
Template
classe a été introduite dans Python 2.4 - La
format
méthode a été introduite dans Python 2.6 f
-strings ont été introduits dans Python 3.6
Mes questions sont:
- La
printf
mise en forme -style est-elle obsolète ou va-t-elle l'être? - Dans le
Template class
, lasubstitute
méthode est-elle obsolète ou va-t-elle l'être? (Je ne parle pas desafe_substitute
, qui, d'après ce que je comprends, offre des capacités uniques)
Questions similaires et pourquoi je pense qu'il ne s'agit pas de doublons:
Formatage de chaîne Python:% vs .format - traite uniquement les méthodes 1 et 2 et demande laquelle est la meilleure; ma question porte explicitement sur la dépréciation à la lumière du Zen de Python
Options de formatage de chaîne: avantages et inconvénients - traite uniquement les méthodes 1a et 1b dans la question, 1 et 2 dans la réponse, et rien sur la dépréciation
mise en forme de chaîne avancée vs chaînes de modèle - principalement sur les méthodes 1 et 3, et ne résout pas la dépréciation
Expressions de mise en forme de chaîne (Python) - la réponse mentionne que l'approche originale '%' devrait être obsolète . Mais quelle est la différence entre la dépréciation prévue , la dépréciation en attente et la dépréciation réelle ? Et la
printf
méthode -style ne lève même pas aPendingDeprecationWarning
, est-ce que cela va vraiment être obsolète? Ce message est également assez ancien, donc les informations peuvent être obsolètes.
Formatter
cours?Réponses:
Bien qu'il existe diverses indications dans la documentation selon lesquelles les
.format
f-strings sont supérieures aux%
chaînes, il n'y a pas de plan survivant pour déprécier ces dernières.Dans le problème de validation n ° 14123: mentionnez explicitement que le formatage de chaîne de style% ancien comporte des mises en garde mais qu'il ne disparaîtra pas de si tôt. , inspiré du problème Indique qu'il n'y a actuellement aucun projet de déprécier le formatage de style printf , la documentation sur le
%
formatage a été modifiée pour contenir cette phrase:(Soulignez le mien.)
Cette phrase a été supprimée plus tard, dans commit Close # 4966: réorganiser la documentation de la séquence afin de mieux expliquer l'état de Python moderne . Cela peut sembler un signe qu'un plan visant à déprécier le
%
formatage était de retour sur les cartes ... mais plonger dans le suivi des bogues révèle que l'intention était le contraire. Sur le bug tracker, l'auteur du commit caractérise le changement comme ceci :En d'autres termes, nous avons eu deux changements consécutifs dans les
%
documents de mise en forme destinés à souligner explicitement qu'il ne sera pas obsolète, et encore moins supprimé. Les documents restent avisés sur les mérites relatifs des différents types de formatage de chaîne, mais ils sont également clairs que le%
formatage ne sera pas obsolète ou supprimé.De plus, la dernière modification apportée à ce paragraphe , en mars 2017, l'a changé à partir de cela ...
... pour ça:
Notez que le changement de "aide à éviter" à "peut aider à éviter", et comment la recommandation claire de
.format
et f-strings a été remplacée par une prose duveteuse et équivoque sur la façon dont chaque style "fournit ses propres compromis et avantages" . Autrement dit, non seulement une dépréciation formelle n'est plus sur les cartes, mais la documentation actuelle reconnaît ouvertement que le%
formatage a au moins quelques "avantages" par rapport aux autres approches.Je déduire de tout cela que le mouvement pour désapprouver ou supprimer le
%
formatage a non seulement échoué, mais a été complètement et définitivement vaincu.la source
%
. Maintenant que la politique «pas de mods de code à grande échelle» a été abandonnée, leurs objections s'estompent également. À long terme, le maintien de ces deux formes sans prestations qui restent pour%
à un moment donné la syntaxe printf sera supprimée de toute façon. Nous ne savons tout simplement pas quand encore, et donc la langue valait la peine d'être atténuée.La nouvelle
.format()
méthode est destinée à remplacer l'ancienne%
syntaxe de formatage. Ce dernier a été désaccentué, (mais pas officiellement désapprouvée encore ). La documentation de la méthode le déclare:(Je souligne le mien).
Pour maintenir la compatibilité ascendante et faciliter la transition, l'ancien format a été laissé en place pour le moment . D'après la proposition originale PEP 3101 :
Notez le jusqu'à ce qu'il soit temps de désapprouver l'ancien système ; il n'est pas obsolète, mais le nouveau système doit être utilisé chaque fois que vous écrivez un nouveau code .
Le nouveau système a pour avantage que vous pouvez combiner l'approche tuple et dictionnaire de l'ancien
%
formateur:et est extensible via le
object.__format__()
crochet utilisé pour gérer le formatage des valeurs individuelles.Notez que l'ancien système avait
%
et leTemplate
classe, où cette dernière vous permet de créer des sous-classes qui ajoutent ou modifient son comportement. Le système de style nouveau a laFormatter
classe pour occuper le même créneau.Python 3 s'est encore éloigné de la dépréciation, vous donnant plutôt un avertissement dans le
printf
formatage de chaîne -style section :Python 3.6 a également ajouté des littéraux de chaîne formatés , qui alignent les expressions dans les chaînes de format. Il s'agit de la méthode la plus rapide de création de chaînes avec des valeurs interpolées et doit être utilisée à la place de
str.format()
partout où vous pouvez utiliser un littéral.la source
Formatter
vous pouvez créer des formats personnalisés tels que ceuxdatetime
utilisés par les objets. De plus, puisque.format
c'est une fonction, vous pouvez l'utiliser pour créer un formatage paresseux appelable plus directement: par exemple,fmt = '{} - {}'.format; fmt(a, b)
Template
est lié à%
ou à l' ancien système . En particulier, le PEP que vous liez les états Bien qu'il y ait un certain chevauchement entre cette proposition etstring.Template
, on estime que chacun répond à un besoin distinct, et que l'un ne supprime pas l'autre. Dans votre réponse, on peut être confus que leTemplate
formatage, faisant partie de l' ancien système , est également obsolète.Formatter
classe peut combler les mêmes besoins questring.Template()
.[...]should be preferred to the % formatting[...]
cette partie a été supprimée de la documentation. docs.python.org/3/library/stdtypes.html#str.formatL'
%
opérateur de formatage de chaîne n'est pas obsolète et ne sera pas supprimé - malgré les autres réponses.Chaque fois que le sujet est soulevé sur la liste de développement Python, il y a une forte controverse sur ce qui est mieux, mais aucune controverse sur l'opportunité de supprimer la méthode classique - cela restera. Bien qu'il soit indiqué sur PEP 3101, Python 3.1 était venu et reparti, et le
%
formatage est toujours là.Les déclarations pour le style classique de conservation sont claires: c'est simple, c'est rapide, c'est rapide à faire pour des choses courtes. Utiliser la
.format
méthode n'est pas toujours plus lisible - et presque personne - même parmi les développeurs principaux, peut utiliser la syntaxe complète fournie par.format
sans avoir à regarder la référence Même en 2009, on avait des messages comme celui-ci: http: // mail. python.org/pipermail/python-dev/2009-Octobre/092529.html - le sujet était à peine apparu dans les listes depuis.Mise à jour 2016
Dans la version actuelle de développement de Python (qui deviendra Python 3.6), il existe une troisième méthode d'interpolation de chaîne, décrite sur PEP-0498 . Il définit un nouveau préfixe de guillemet
f""
(en plus de l'actuelu""
,b""
etr""
).Le préfixe d'une chaîne par
f
appellera une méthode sur l'objet chaîne au moment de l'exécution, qui interpolera automatiquement les variables de la portée actuelle dans la chaîne:la source
__format__
. Par exemple,format(Decimal('0.1'), '.20f')
vs'%.20f' % Decimal('0.1')
. Ce dernier contraint le Decimal à un flotteur.f
en Python 3?f-strings
utilisés ci-dessus sont une nouvelle fonctionnalité du langage à partir de Python 3.6. Il n'existe pas dans les versions précédentes et provoquera une erreur de syntaxe sur celles-ci.La dernière position de Guido à ce sujet semble être indiquée ici:
Nouveautés de Python 3.0
Et le PEP3101 lui-même, qui a la dernière modification datant de (ven, 30 septembre 2011), donc aucun progrès ces derniers temps sur celui-là, je suppose.
la source
En regardant les anciens documents Python et PEP 3101, il y avait une déclaration selon laquelle l'opérateur% sera obsolète et supprimé du langage à l'avenir. L' instruction suivante figurait dans la documentation Python pour Python 3.0, 3.1 et 3.2:
Si vous accédez à la même section dans les documents Python 3.3 et 3.4, vous verrez que l'instruction a été supprimée. Je ne trouve également aucune autre déclaration nulle part ailleurs dans la documentation indiquant que l'opérateur sera obsolète ou supprimé de la langue. Il est également important de noter que PEP3101 n'a pas été modifié depuis plus de deux ans et demi (ven, 30 sept. 2011).
Mettre à jour
PEP461 L'ajout de% de mise en forme aux octets et aux bytes est accepté et devrait faire partie de Python 3.5 ou 3.6. C'est un autre signe que l'opérateur% est bien vivant.
la source