bashasha umer
bashasha umer

Reputation: 45

f-string formatting with only constant expressions?

I'm trying to learn Python from the book: "Fluent Python, 2nd Ed" by Luciano Ramalho.

Example 2-8. Unpacking nested tuples to access the longitude

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()

Here in print(f'{"":15} | {"latitude":>9} | {"longitude":>9}') I can't understand logic behind using {"":15}, {"latitude":>9, {"longitude":>9} part of the code. Can anyone can explain why the writer uses this in a print() function call?

The output:

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

Upvotes: 0

Views: 1204

Answers (2)

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

Here the author is just formatting the values nicely to human readers. He's using what's knowns as f-strings which is used to interpolate strings.

You can place expressions inside curly braces of strings prefixed with an f, as in this case.

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

The colon is used to apply a format specifier to the expression. In this case, the specifier > "Forces the field to be right-aligned within the available space", and the number 9 is the width for that specifier.

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

Upvotes: 1

Thomas
Thomas

Reputation: 182048

The purpose is to print the table header with the same field widths as the actual table, so that they line up. Compare these lines:

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

Instead of variables (name, lat, lon), the author is passing literal strings ("", "latitude", "longitude") to the f-string format arguments instead. This is valid, because the part between {} can be any valid expression.

By using the same field widths (15, 9, 9) in both statements, the code ensures that the column headings have the same width as the actual table cells, so they are aligned in the output.

Upvotes: 2

Related Questions