今回は、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() メソッドは、文字列中のすべての key
を value
に置き換えます。
これは、該当する場合、すべての置換が行われた新しい文字列を返します。
これをよりよく理解するために、以下のようなマッピング辞書を考えてみましょう。
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のmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
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()メソッドとの簡単な比較も見てみました。