0%

使用format與locals進行字串格式化

寫python在做字串格式化的時候,常常會使用format來達成。一般簡單的format用法,會使用大括弧加數字編號配合引數順序做取代

1
2
>>> str = "My name is {0}, and I'm {1} years old".format('Tom', 18)
"My name is Tom, and I'm 18 years old"

在Python3.1開始可以省略數字編號

1
2
>>> str = "My name is {}, and I'm {} years old".format('Tom', 18)
"My name is Tom, and I'm 18 years old"

或是使用欄位名稱來取代對應引數

1
2
str = "My name is {name}, and I'm {age} years old".format(name='Tom', age=18)
"My name is Tom, and I'm 18 years old"

format可以搭配dict一起使用,將dict傳入並取出其中的value來完成取代

1
2
3
>>> d = {'name': 'Tom', 'age': 18}
>>> str = "My name is {0[name]}, and I'm {0[age]} years old".format(d)
"My name is Tom, and I'm 18 years old"

既然可以使用dict來結合format做字串取代,所以我們可透過內建的locals()來取得一個儲存當前區域變數的dict,並把區域變數的值帶入fomat來取代對應引數

1
2
3
4
>>> name = 'Tom'
>>> age = 18
>>> str = "My name is {0[name]}, and I'm {0[age]} years old".format(locals())
"My name is Tom, and I'm 18 years old"

我們可以再進一步使用拆開映射(maping unpacking)運算來將dic拆開來傳入format,python就會自動填入對應的值

1
2
3
4
>>> name = 'Tom'
>>> age = 18
>>> str = "My name is {name}, and I'm {age} years old".format(**locals())
"My name is Tom, and I'm 18 years old"

任何的dict都可以使用,上面的例子可以改寫成

1
2
3
>>> d = {'name': 'Tom', 'age': 18}
>>> str = "My name is {name}, and I'm {age} years old".format(**d)
"My name is Tom, and I'm 18 years old"

參考資料:
Python Unpacking請參考: 透過*和**來對群集資料Unpacking