Je me demandais s'il y avait un avantage à utiliser chaînes de modèle au lieu du nouveau formatage de chaîne avancé ?
Les modèles sont censés être plus simples que le formatage de chaîne habituel, au détriment de l'expressivité. La justification de PEP 292 compare les modèles à la mise en forme de chaîne de style %
De Python:
Python prend actuellement en charge une syntaxe de substitution de chaîne basée sur le caractère de formatage
printf()
'%' de C. Bien qu'ils soient assez riches, les codes au format% sont également sujets aux erreurs, même pour les programmeurs expérimentés Python. Une erreur courante consiste à laisser le caractère de format de fin, par exemples
dans%(name)s
.De plus, les règles concernant ce qui peut suivre un signe% sont assez complexes, alors que l'application habituelle a rarement besoin d'une telle complexité. La plupart des scripts doivent effectuer une interpolation de chaîne, mais la plupart d'entre eux utilisent un simple
stringification' formats, i.e.
% Sor
% (nom) s` Ce formulaire devrait être simplifié et moins sujet aux erreurs.
Bien que la nouvelle .format()
ait amélioré la situation, il est toujours vrai que la format string syntax est plutôt complexe, donc la logique a toujours ses points.
Pour ce que ça vaut, la substitution de modèle à partir d'un dicton semble être 4 à 10 fois plus lente que la substitution de format, selon la longueur du modèle. Voici une comparaison rapide que j'ai exécutée sous OS X sur un Core i7 à 2,3 GHz avec Python 3.5.
from string import Template
lorem = "Lorem ipsum dolor sit amet {GIBBERISH}, consectetur adipiscing elit {DRIVEL}. Expectoque quid ad id, quod quaerebam, respondeas."
loremtpl = Template("Lorem ipsum dolor sit amet $GIBBERISH, consectetur adipiscing elit $DRIVEL. Expectoque quid ad id, quod quaerebam, respondeas.")
d = dict(GIBBERISH='FOOBAR', DRIVEL = 'RAXOOP')
In [29]: timeit lorem.format(**d)
1.07 µs ± 2.13 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [30]: timeit loremtpl.substitute(d)
8.74 µs ± 12.9 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
Le pire des cas que j'ai testé était environ 10 fois plus lent pour une chaîne de 13 caractères. Le meilleur cas que j'ai testé était environ 4 fois plus lent pour une chaîne de 71 000 caractères.
L'un des principaux avantages des modèles de chaînes est que vous ne pouvez remplacer que certains des espaces réservés à l'aide de safe_substitute
méthode . Les chaînes de format normal généreront une erreur si un espace réservé ne reçoit pas de valeur. Par exemple:
"Hello, {first} {last}".format(first='Joe')
soulève:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'last'
Mais:
from string import Template
Template("Hello, $first $last").safe_substitute(first='Joe')
Produit:
'Hello, Joe $last'
Notez que la valeur renvoyée est une chaîne, pas un Template
; si vous voulez remplacer le $last
vous devrez créer un nouvel objet Template
à partir de cette chaîne.
C'est principalement une question de préférence de syntaxe, qui se résume généralement à un compromis paresse/verbosité et familiarité/habitude avec les systèmes de modèles de chaînes existants. Dans ce cas, les chaînes de modèle sont plus paresseuses/simples/rapides à écrire, tandis que .format()
est plus verbeuse et pleine de fonctionnalités.
Les programmeurs habitués au langage PHP ou à la famille de systèmes de modèles Jinja peuvent préférer les chaînes de modèles. L'utilisation de la substitution de tuple de style positionnel "% s" peut plaire à ceux qui utilisent printf
- comme .format()
a quelques fonctionnalités supplémentaires, mais à moins que vous ayez besoin de quelque chose de spécifique que seule .format()
fournit, il n'y a rien de mal à utiliser un schéma existant.
La seule chose à savoir est que les modèles de chaînes nommées sont plus flexibles et nécessitent moins de maintenance que ceux dépendant de la commande. En dehors de cela, tout se résume soit à des préférences personnelles, soit à la norme de codage du projet sur lequel vous travaillez;