Muitas vezes tenho que fazer várias substituições da mesma string:
(format "%s %s %s" "a" "a" "a") ;; gives: "a a a"
(é apenas um exemplo fictício, nesse caso, é melhor colar "a" com um espaço em branco, mas, em geral, eu lido com situações mais complicadas)
Existe uma maneira de fazer uma substituição nomeada? Por exemplo, em python, alguém escreveria:
"{0} {0} {0}".format("a") # or:
"{name} {name} {name}".format(name="a")
Respostas:
Reescrever esta resposta fornece outra solução:
Edit : Outra
format-spec
soluçãoComo Malabarba dá outra solução nos comentários:
Edit 2 : Avaliação antes da substituição:
Aqui estão exemplos com avaliação antes da substituição:
fonte
format-spec-make
é apenas uma lista de'((?a . "a") (?b . "b"))
A biblioteca de manipulação de cadeias de caracteres de Magnar Sveen, s.el, oferece várias maneiras de fazer isso. Por exemplo:
Note-se que
s-format
pode tomar qualquer função de substituto, mas fornece tratamento especial paraaget
,elt
, egethash
. Então você pode usar uma lista de tokens e referenciá-los por índice, da seguinte forma:Você também pode substituir usando variáveis no escopo, como este:
fonte
O formato s-lex do s.el é realmente o que você deseja, mas se você deseja realmente colocar código dentro dos blocos de substituição e não apenas nos nomes das variáveis, escrevi isso como uma prova de conceito.
Você pode até incorporar uma
fmt
ligação dentro de outra,fmt
se estiver doidoO código apenas se expande para uma
format
chamada, para que todas as substituições sejam feitas em ordem e avaliadas em tempo de execução.Melhorias poderiam ser feitas com o tipo de formato usado em vez de sempre usar% s, mas isso teria que ser feito em tempo de execução e aumentaria a sobrecarga, mas poderia ser feito envolvendo todos os argumentos de formato em uma chamada de função que formata bem as coisas no tipo, mas realmente o único cenário em que você gostaria que isso seja provavelmente flutua e você pode até fazer um (formato "% f" float) na substituição é que estava desesperado.
Se eu trabalhar mais nisso, é mais provável que atualize essa essência em vez desta resposta. https://gist.github.com/jordonbiondo/c4e22b4289be130bc59b
fonte
Não é de uso geral, mas resolverá seu caso:
Usando o exemplo fornecido:
dá:
fonte
" * - :raw-html:`<img width=\"100%%\" src=\"http://xxx.xxx/images/languages/staff/%s.jpg\" alt=\"%s.jpg\"/>` - .. _%s:"
- todos%s
são iguais.