44 lines
1.5 KiB
Python
44 lines
1.5 KiB
Python
|
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))
|