import sys if __name__ == "__main__": # 一般来说,我们用{}和format函数对字符串进行插值 s = "{name} has {n} messages" s1 = s.format(name="Sam", n=10) print(s1) # 当然如果你想偷懒,也可以这样: name = "Sam" n = 10 s2 = s.format_map(vars()) print(s2) # 在上面这段代码中,vars函数会从堆栈里自动寻找变量名称的值 # vars还能解析类实例: class INFO: def __init__(self, name, n): self.name = name self.n = n info = INFO(name, n) s3 = s.format_map(vars(info)) print(s3) # 爽吗?确实爽,但是有一个缺点,在填充值缺失的时候这玩意儿会报错 try: s4 = s.format(name=name) except KeyError: print("少参数") # 我们可以定义一个类的__missing__方法来防止出现这种情况 class Safe_Sub(dict): def __missing__(self, key): return '{'+ key +'}' del n print(s.format_map(Safe_Sub(vars()))) # 如果经常操作,那么可以把这个功能藏在函数里,同时从当前调用的堆栈里找到变量(我反正不建议这么干,不过得知道) def sub(text): # 不!要!在!代码里!碰!tmd!堆栈!这是手贱行为,可能导致各种bug,除非有必要的理由否则不要这么做 return text.format_map(Safe_Sub(sys._getframe(1).f_locals)) name = "Suka" print(sub(s))