Dato che Python 3.0 e 3.1 sono EOL e nessuno li usa, puoi e dovresti usare str.format_map(mapping)
(Python 3.2+):
Simile a str.format(**mapping)
, tranne per il fatto che la mappatura viene utilizzata direttamente e non copiata in adict
. Ciò è utile se ad esempio il mapping è una dict
sottoclasse.
Ciò significa che è possibile utilizzare ad esempio un defaultdict
che imposta (e restituisce) un valore predefinito per le chiavi mancanti:
>>> 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'
Anche se la mappatura fornita è una dict
, non una sottoclasse, probabilmente sarebbe comunque leggermente più veloce.
Tuttavia, la differenza non è grande
>>> d = dict(foo='x', bar='y', baz='z')
poi
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)
è circa 10 ns (2%) più veloce di
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)
sul mio Python 3.4.3. La differenza sarebbe probabilmente maggiore poiché più chiavi sono nel dizionario e
Si noti che il linguaggio del formato è molto più flessibile di quello però; possono contenere espressioni indicizzate, accessi agli attributi e così via, in modo da poter formattare un intero oggetto o 2 di essi:
>>> 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 partire dalla 3.6 puoi usare anche le stringhe interpolate:
>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'
Devi solo ricordare di usare gli altri caratteri tra virgolette. Un altro aspetto positivo di questo approccio è che è molto più veloce di chiamare un metodo di formattazione.