仅使用常量表达式的 f 字符串格式?

f-string formatting with only constant expressions?

我正在尝试从这本书中学习 Python:Luciano Ramalho 的“Fluent Python, 2nd Ed”。

示例 2-8。解包嵌套元组以访问经度

metro_areas = [
    ('Tokyo', 'JP', 36.933, (35.689722, 139.691667)),  
    ('Delhi NCR', 'IN', 21.935, (28.613889, 77.208889)),
    ('Mexico City', 'MX', 20.142, (19.433333, -99.133333)),
    ('New York-Newark', 'US', 20.104, (40.808611, -74.020386)),
    ('São Paulo', 'BR', 19.649, (-23.547778, -46.635833)),
]

def main():
    print(f'{"":15} | {"latitude":>9} | {"longitude":>9}')
    for name, _, _, (lat, lon) in metro_areas:
        if lon <= 0:
            print(f'{name:15} | {lat:9.4f} | {lon:9.4f}')

if __name__ == '__main__':
    main()

print(f'{"":15} | {"latitude":>9} | {"longitude":>9}') 中,我无法理解使用 {"":15}, {"latitude":>9, {"longitude":>9} 部分代码背后的逻辑。谁能解释为什么作者在 print() 函数调用中使用它?

输出:

                |   lat.    |   lon.
Mexico City     |   19.4333 |  -99.1333
New York-Newark |   40.8086 |  -74.0204
São Paulo       |  -23.5478 |  -46.6358

目的是打印出tableheader与实际table一样的字段宽度,让它们排成一行。比较这些行:

print(f'{"":15} | {"latitude":>9} | {"longitude":>9}')
print(f'{name:15} | {lat:9.4f} | {lon:9.4f}')

作者传递的不是变量(namelatlon)而是文字字符串("""latitude""longitude") 改为 f-string 格式参数。这是有效的,因为 {} 之间的部分可以是任何有效的表达式。

通过在两个语句中使用相同的字段宽度(1599),代码可确保列标题与实际 table 个单元格,因此它们在输出中对齐。

print(f'{"":15} | {"latitude":>9} | {"longitude":>9}')

这里作者只是为人类读者很好地格式化值。他正在使用所谓的 f-strings 来插入字符串。

您可以将表达式放在以 f 为前缀的字符串的花括号内,如本例所示。

https://docs.python.org/3.9/library/string.html#format-specification-mini-language

冒号用于将格式说明符应用于表达式。在这种情况下,说明符 >“强制字段在可用范围内右对齐 space”,数字 9 是该说明符的宽度。

https://docs.python.org/3.9/library/string.html#format-specification-mini-language