2012-07-24 19 views

Respuesta

16

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. el s 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.

+0

¿Entonces la única ventaja de las plantillas de cadenas es que es menos compleja? – P3trus

+5

@ 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. –

2

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;

+0

Pero también se pueden usar los campos con nombre en '.format'. – P3trus

+0

@ 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. –

+0

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

4

Una ventaja clave de las plantillas de cadena es que se puede sustituir solamente algunos de los marcadores de posición con el safe_substitutemethod. 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.

+0

¿Estás seguro de que es una ventaja? – mcepl

+0

Plantilla ("Hola, $ primero $ último"). Safe_substitute (first = 'Joe') no produce nada. Tienes que imprimirlo. :) – Apostolos

8

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.

+0

Gracias por compartir resultados de actuaciones, es lo que estaba buscando. –

Cuestiones relacionadas