Python 3.0および3.1はEOL済みであり、誰も使用していないため、str.format_map(mapping)
(Python 3.2+)を使用でき、使用する必要があります。
に似ていますがstr.format(**mapping)
、マッピングは直接使用され、にはコピーされませんdict
。これは、たとえばマッピングがdict
サブクラスである場合に役立ちます。
これが意味することは、たとえば、defaultdict
欠落しているキーのデフォルト値を設定(および返す)することができるということです。
>>> 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'
提供されたマッピングが dict
サブクラスではなくであっとしても、これはおそらくわずかに速いでしょう。
与えられた違いは、しかし、大きくはありません
>>> d = dict(foo='x', bar='y', baz='z')
その後
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)
よりも約10 ns(2%)速い
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)
私のPython 3.4.3で。辞書にあるキーが多いほど、その差は大きくなるでしょう。
ただし、フォーマット言語はそれよりもはるかに柔軟です。インデックス付きの式や属性アクセスなどを含めることができるため、オブジェクト全体またはその2つをフォーマットできます。
>>> 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'
3.6からは、補間された文字列も使用できます。
>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'
ネストされた引用符内で他の引用文字を使用することを覚えておく必要があるだけです。このアプローチのもう1つの利点は、フォーマットメソッドを呼び出すよりもはるかに高速であることです。