Me preguntaba si existe la ventaja de utilizar template strings en lugar del nuevo advanced string formatting?formateo de cadenas avanzadas frente a cadenas de plantillas
Respuesta
Las plantillas están diseñadas para ser más simples que el formato de cadena habitual, a costa de la expresividad. La razón de ser de PEP 292 compara las plantillas de formato de cadenas de estilo de Python %
:
Python actualmente soporta una sintaxis de sustitución de cadenas basado en de C
printf()
'%' formato de caracteres. Aunque son bastante ricos, los códigos de formato % también son propensos a errores, incluso para los programadores experimentados de Python . Un error común es dejar como el carácter de formato posterior, p. els
en%(name)s
.Además, las reglas para lo que puede seguir a un signo% son bastante complejo, mientras que la aplicación habitual rara vez necesita tal complejidad. La mayoría de los scripts necesitan hacer una interpolación de cadenas, pero la mayoría de usan el
stringification' formats, i.e.
% % (name) s` Este formulario debe ser más simple y menos propenso a errores.
Mientras que el nuevo .format()
mejorado la situación, sigue siendo cierto que el format string syntax es bastante complejo, por lo que la razón tiene sus lugares.
¿Entonces la única ventaja de las plantillas de cadenas es que es menos compleja? – P3trus
@ P3trus: básicamente, sí. En ocasiones, los diferentes metacaracteres también pueden adaptarse a situaciones diferentes. Si, por ejemplo, escribe un fragmento de código C en un archivo con algunas cadenas reemplazadas, una cadena de plantilla podría ser preferible ya que no necesita doblar todas las llaves para escapar de ellas, y dado que '$' no tiene ningún significado especial en C. –
Es principalmente una cuestión de preferencia de sintaxis, que generalmente se reduce a una compensación de pereza/verbosidad y familiaridad/hábitos con los sistemas de plantillas de cadenas existentes. En este caso, las cadenas de plantillas son más vagas/simples/rápidas de escribir, mientras que .format()
es más detallado y lleno de funciones.
Los programadores utilizados para el lenguaje PHP o la familia de plantillas Jinja pueden preferir cadenas de plantillas. El uso de la sustitución de tupla de estilo posicional "% s" puede ser útil para quienes usan el formato de cadena printf
o desean algo rápido. .format()
tiene algunas características más, pero a menos que necesite algo específico que solo proporciona .format()
, no hay nada de malo en usar cualquier esquema existente.
Lo único a tener en cuenta es que las plantillas de cadenas con nombre son más flexibles y requieren menos mantenimiento que las dependientes de las órdenes. Aparte de eso, todo se reduce a la preferencia personal o al estándar de codificación del proyecto en el que está trabajando;
Pero también se pueden usar los campos con nombre en '.format'. – P3trus
@ P3trus Me malinterpretas. Estaba diciendo que aunque ambos métodos proporcionan campos ordenados * y * como una función, los campos con nombre son más flexibles y robustos para cambiar, independientemente de la API de plantillas que utilice; fue un juicio de valor sobre una característica común a ambos métodos, no sobre los métodos mismos. –
No puedo ver cuándo las plantillas serían menos detalladas que el formato(), p. Ej. 'string.Template ('bob is $ age years old'). substituto (edad = edad)' vs ''bob tiene {edad} años' .format (edad)' – danio
Una ventaja clave de las plantillas de cadena es que se puede sustituir solamente algunos de los marcadores de posición con el safe_substitute
method. Las cadenas de formato normales generarán un error si no se pasa un valor a un marcador de posición.Por ejemplo:
"Hello, {first} {last}".format(first='Joe')
plantea:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
KeyError: 'last'
Pero:
from string import Template
Template("Hello, $first $last").safe_substitute(first='Joe')
Produce:
'Hello, Joe $last'
Tenga en cuenta que el valor devuelto es una cadena, no un Template
; si desea sustituir el $last
, deberá crear un nuevo objeto Template
a partir de esa cadena.
Por lo que vale, la sustitución de plantilla de un dict parece ser de 4 a 10 veces más lenta que la sustitución de formato, dependiendo de la longitud de la plantilla. Aquí hay una comparación rápida que ejecuté bajo OS X en un Core i7 de 2.3 GHz con 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)
El peor caso que probé fue aproximadamente 10 veces más lento para una cadena de 13 caracteres. El mejor caso que probé fue aproximadamente 4 veces más lento para una cadena de 71000 caracteres.
Gracias por compartir resultados de actuaciones, es lo que estaba buscando. –
- 1. Comparaciones avanzadas de cadenas en Oracle SQL
- 2. Manipulación de cadenas frente a Regexps
- 3. "Cadenas de mensajes" frente a "Hombre medio"
- 4. Paquete de estadísticas Java? (Cadenas de Markov y distribuciones avanzadas)
- 5. Biblioteca de plantillas de cadenas C++
- 6. ¿Hay ventajas en el uso del formato de cadenas frente a la concatenación de cadenas?
- 7. Cómo concatenar cadenas en plantillas django?
- 8. expresiones de cadenas (Python)
- 9. Grails: Plantillas frente a TagLibs.
- 10. Buscar subsecuencias de cadenas dentro de cadenas
- 11. manera eficiente de buscar cadenas en la lista de cadenas?
- 12. ¿Qué clases usas para hacer plantillas de cadenas?
- 13. ¿NVelocity ya no es compatible con plantillas de cadenas?
- 14. Lenguaje de plantillas frente a PHP directo
- 15. Formateador de cadenas en GWT
- 16. Eliminar cadenas duplicadas en matriz de cadenas
- 17. Anexar cadenas a NSMutableString
- 18. Cómo convertir cadenas UTF-8 a cadenas RTF en java?
- 19. Comparación de cadenas MySQL
- 20. Conversión de matriz de cadenas a java.util.List
- 21. Concatenación de cadenas Vs Generador de cadenas Agregar
- 22. ¿Por qué las cadenas se llaman "cadenas"?
- 23. Python: forma abreviada de descomprimir la lista para el operador de formateo de cadenas?
- 24. C++ cadenas literales contra cadenas const
- 25. cadenas AutoMapper a ENUM descripciones
- 26. Comparación de cadenas y prácticas de cadenas en Java
- 27. ¿Cómo combinar cadenas de C++ y cadenas de Arduino?
- 28. Eliminar cadenas vacías de una lista de cadenas
- 29. Cómo convertir cadenas a control?
- 30. ¿Cómo agregar elementos de una matriz de cadenas a una lista de matriz de cadenas?
Aquí hay uno que es difícil de hacer con cadenas de plantilla http://stackoverflow.com/questions/11388180 –
Buena pregunta (+1). Curiosamente, nunca había leído seriamente la parte de los documentos en cadenas de plantillas antes de ahora ... – mgilson