方法一:也是 比較好用的,功能教齊全
s="{name} is {sex}" print(s.format(name="zzy",sex="girl")) # zzy is girl
如果要被替換的變量能在變量域中找到, 那么你可以結合使用 format_map() 和 vars()
vars()找到所有局部變量
name="zxc" sex="boy" print(s.format_map(vars())) # zxc is boy
vars() 還有一個有意思的特性就是它也適用於對象實例。
class Info: def __init__(self,name,sex): self.name=name self.sex=sex a=Info("zzz","beautiful") print(s.format_map(vars(a))) # zzz is beautiful
缺陷:format 和 format_map() 的一個缺陷就是它們並不能很好的處理變量缺失的情況
s = "{name} is {sex}" print(s.format(name='Guido')) 報錯: """ Traceback (most recent call last): File "/home/zzy/PycharmProjects/MyTest/littleTest.py", line 301, in <module> print(s.format(name='Guido')) KeyError: 'sex' """
解決:
我們把參數sex 手動清除
s = "{name} is {sex}" name = "zxc" class safesub(dict): """防止key找不到""" def __missing__(self, key): return '{' + key + '}' print(s.format_map(safesub(vars()))) # zxc is {sex} # 映射或者字典類中鮮為人知的 __missing__() 方法可以讓你定義如何處理缺失的值。 在 SafeSub 類中,這個方法被定義為對缺失的值返回一個占位符。 你可以發現缺失的值會出現在結果字符串中(在調試的時候可能很有用),而不是產生一個 KeyError 異常
如果你發現自己在代碼中頻繁的執行這些步驟,你可以將變量替換步驟用一個工具函數封裝起來。就像下面這樣:
import sys def sub(text): return text.format_map(safesub(sys._getframe(1).f_locals)) print(sys._getframe().f_locals) print(sub(s)) # zxc is {sex} #注釋:1:,sub() 函數使用 sys._getframe(1) 返回調用者的棧幀。可以從中訪問屬性 f_locals 來獲得局部變量
方法二: 實現功能的還有一種方法,就是模板字符串,但是教之format_map var 就low一些了,,也是沒法處理變量缺失問題使用 format() 方法還有一個好處就是你可以獲得對字符串格式化的所有支持(對齊,填充,數字格式化等待)
import string n=24 s = string.Template('$name has $n messages.') print(s.substitute(vars())) # zxc has 24 messages.