这是因为您可以使用格式迷你语言来访问对象的属性.例如,我经常在自己的自定义类工作中使用它.假设我为每台需要处理的计算机定义了一个类.
class Computer(object):
def __init__(self,IP):
self.IP = IP
而现在我想对整个计算机做一些事情
list_comps = [Computer(name,"192.168.1.{}".format(IP)) for IP in range(12)]
for comp in list_comps:
frobnicate(comp) # do something to it
print("Frobnicating the computer located at {comp.IP}".format(comp=comp))
现在它将打印出来
Frobnicating the computer located at 192.168.1.0
Frobnicating the computer located at 192.168.1.1
Frobnicating the computer located at 192.168.1.2 # etc etc
因为每次,它都会找到我传递给formatter(comp)的对象,抓取它的属性IP,然后使用它.在您的示例中,您为格式化程序提供了类似于属性访问器(.)的内容,因此它尝试访问在访问者之前给定的对象,然后查找其定义的属性.
你的最后一个例子是有效的,因为它正在寻找测试,它找到了它! :符号对格式化程序来说是特殊的,因为它标记了kwarg的结尾和格式迷你语言的开头.例如:
>>> x = 12.34567
>>> print("{x:.2f}".format(x))
12.34
:之后的.2f告诉字符串格式化程序将参数x视为浮点数并在小数点后2位数后截断它.这是well documented,我强烈建议你仔细看看这个,并将其加入书签以备将来使用!这非常有帮助!