Como Python 3.0 y 3.1 tienen EOL y nadie los usa, usted puede y debe usar str.format_map(mapping)
(Python 3.2+):
Similar a str.format(**mapping)
, excepto que la asignación se usa directamente y no se copia adict
. Esto es útil si, por ejemplo, el mapeo es una dict
subclase.
Lo que esto significa es que puede usar, por ejemplo, un valor defaultdict
que establecería (y devolvería) un valor predeterminado para las claves que faltan:
>>> from collections import defaultdict
>>> vals = defaultdict(lambda: '<unset>', {'bar': 'baz'})
>>> 'foo is {foo} and bar is {bar}'.format_map(vals)
'foo is <unset> and bar is baz'
Incluso si el mapeo proporcionado es una dict
subclase, no una subclase, probablemente aún sería un poco más rápido.
Sin embargo, la diferencia no es grande, dado
>>> d = dict(foo='x', bar='y', baz='z')
luego
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)
es aproximadamente 10 ns (2%) más rápido que
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)
en mi Python 3.4.3. La diferencia probablemente sería mayor a medida que haya más claves en el diccionario, y
Tenga en cuenta que el lenguaje de formato es mucho más flexible que eso; pueden contener expresiones indexadas, accesos de atributos, etc., para que pueda formatear un objeto completo o 2 de ellos:
>>> p1 = {'latitude':41.123,'longitude':71.091}
>>> p2 = {'latitude':56.456,'longitude':23.456}
>>> '{0[latitude]} {0[longitude]} - {1[latitude]} {1[longitude]}'.format(p1, p2)
'41.123 71.091 - 56.456 23.456'
A partir de 3.6 también puede usar las cadenas interpoladas:
>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'
Solo necesita recordar usar los otros caracteres de comillas dentro de las comillas anidadas. Otra ventaja de este enfoque es que es mucho más rápido que llamar a un método de formateo.