Je dois souvent faire plusieurs substitutions de la même chaîne:
(format "%s %s %s" "a" "a" "a") ;; gives: "a a a"
(c'est juste un exemple factice, dans ce cas, il vaut mieux coller "a" avec un espace, mais en général je traite des situations plus compliquées)
Existe-t-il un moyen de faire une substitution nommée? Par exemple en python on écrirait:
"{0} {0} {0}".format("a") # or:
"{name} {name} {name}".format(name="a")
Réponses:
Réécrire cette réponse donne une autre solution:
Edit : Une autre
format-spec
solutionComme Malabarba donne une autre solution dans les commentaires:
Edit 2 : Évaluation avant substitution:
Voici des exemples avec évaluation avant substitution:
la source
format-spec-make
n'est qu'une liste:'((?a . "a") (?b . "b"))
La bibliothèque de manipulation de chaînes de Magnar Sveen s.el offre une variété de façons de le faire. Par exemple:
Notez que
s-format
peut prendre une fonction de succédané, mais fournit un traitement spécial pouraget
,elt
etgethash
. Vous pouvez donc utiliser une liste de jetons et les référencer par index, comme ceci:Vous pouvez également remplacer à l'aide de variables dans la portée, comme ceci:
la source
Le format s-lex de s.el est vraiment ce que vous voulez, mais si vous voulez réellement pouvoir mettre du code à l'intérieur des blocs de substitution et pas seulement des noms de variables, j'ai écrit cela comme une preuve de concept.
Vous pouvez même intégrer un
fmt
appel dans un autrefmt
si vous êtes fouLe code se développe simplement en un
format
appel afin que toutes les substitutions soient effectuées dans l'ordre et évaluées au moment de l'exécution.Des améliorations pourraient être apportées au type de format utilisé au lieu de toujours utiliser% s, mais cela devrait être fait au moment de l'exécution et ajouterait des frais généraux, mais cela pourrait être fait en entourant tous les arguments de format dans un appel de fonction qui formate joliment les choses en fonction de la base sur le type mais vraiment le seul scénario où vous voudriez que ce soit probablement des flottants et vous pourriez même faire un (format "% f" flottant) dans la substitution est que vous étiez désespéré.
Si j'y travaille plus, je suis plus susceptible de mettre à jour cet essentiel au lieu de cette réponse. https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b
la source
Pas un usage général, mais résoudra votre cas:
En utilisant l'exemple fourni:
donne:
la source
" * - :raw-html:`<img width=\"100%%\" src=\"http://xxx.xxx/images/languages/staff/%s.jpg\" alt=\"%s.jpg\"/>` - .. _%s:"
- tous%s
sont les mêmes.