Pythonのformat_mapメソッドの使い方を解説する

スポンサーリンク

今回は、Python String format_map() メソッドについて説明します。

このメソッドは、マップベースの置換を使用して、中括弧{}で囲んだ文字列をフォーマットして返します。

いくつかの例を使って、これを正しく理解しましょう。

スポンサーリンク

Python の基本 String format_map()

Python String format_map() 関数は Python 3.2 以降で利用可能です。

このStringメソッドの基本的な構文は以下の通りです。

substituted_string = str.format_map(mapping)

ここで、mappingは辞書のような任意のマッピングを指定することができます

マッピングは {key: value} のような形式と見なすことができます。

Python String format_map() メソッドは、文字列中のすべての keyvalue に置き換えます。

これは、該当する場合、すべての置換が行われた新しい文字列を返します。

これをよりよく理解するために、以下のようなマッピング辞書を考えてみましょう。

dict_map = {"prog_lang": "Python", "site": "Python"}

ここで、辞書のキーをフォーマット置換(中括弧)の下に持つフォーマット文字列を考えてみましょう。

fmt_string = "Hello from {site}. {site} is a site where you can learn {prog_lang}"

ここで、format_map()を使用して、{site} を “Python” に、{prog_lang} を “Python” に置き換えることができます。

print(fmt_string.format_map(dict_map))

結果は以下の通りです。

Hello from Python. Python is a site where you can learn Python

すべての置換を含む、望みの出力が得られました!

さて、もしマッピング辞書に存在しない追加のフォーマットがあったらどうでしょうか?

dict_map = {"prog_lang": "Python", "site": "Python"}
fmt_string = "Hello from {site}. {site} is a site where you can learn {prog_lang}. What about {other_lang}?"
print(fmt_string.format_map(dict_map))

結果は以下の通りです。

Traceback (most recent call last):
  File "<pyshell#6>", line 1, in <module>
    print(fmt_string.format_map(dict_map))
KeyError: 'other_lang'

KeyError例外が発生します。

Python String format_map() と format() の比較

思い起こせば、format()メソッドもフォーマット文字列に対して適切な置換を行うことで、非常によく似ています。

違いは以下のようにまとめることができます。

  • format()メソッドは、まずマッピング辞書を作成し、その後に置換を行うことで、メソッドのパラメータを使用して間接的に置換を行います。
  • Python String format_map() の場合は、マッピング辞書を直接使用して置換を行います。
  • format_map() は新しい辞書を作らないので、format() より少し速いです。
  • format_map() はマッピングに辞書のサブクラスを使用することができますが、format() はできません。

最後のポイントを説明するために、dictのサブクラスであるClassを作成してみましょう。

また、 __missing__() ダンダメソッドを使って、キーが見つからない場合の処理を試みます。

class MyClass(dict):
    def __missing__(self, key):
        return "#NOT_FOUND#"
 
fmt_string = "Hello from {site}. {site} is a site where you can learn {prog_lang}."
 
my_dict = MyClass(site="Python")
 
print(fmt_string.format_map(my_dict))

結果は以下の通りです。

Hello from Python. Python is a site where you can learn #NOT_FOUND#.

ここで何が起こっているのでしょうか?まだ {site: Python} しか追加していないので、 {prog_lang} のキーがありません。

そのため、__missing__()メソッドによって “#NOT_FOUND#” が返されます。

format()を使用するとどうなるでしょうか。

fmt_string.format(my_dict)

結果は以下の通りです。

Traceback (most recent call last):
  File "<pyshell#14>", line 1, in <module>
    fmt_string.format(my_dict)
KeyError: 'site'

さて、format() はこれを処理してくれず、単に KeyError 例外を発生させるだけです。

これは、マッピングを新しい辞書オブジェクトにコピーしてしまうからです。

マッピングは新しい辞書オブジェクトにあるので、(私たちのサブクラスを使っていないので)、 _missing_

メソッドを持っていません。

まとめ

今回は、Python String format_map() メソッドで書式文字列の置換を行う方法について学びました。

また、format()メソッドとの簡単な比較も見てみました。

タイトルとURLをコピーしました