10

How can I use variables to format my variables?

cart = {"pinapple": 1, "towel": 4, "lube": 1}
column_width = max(len(item) for item in items)
for item, qty in cart.items():
    print "{:column_width}: {}".format(item, qty)

> ValueError: Invalid conversion specification

or

(...):
    print "{:"+str(column_width)+"}: {}".format(item, qty)

> ValueError: Single '}' encountered in format string

What I can do, though, is first construct the formatting string and then format it:

(...):
    formatter = "{:"+str(column_width)+"}: {}"
    print formatter.format(item, qty)

> lube    : 1
> towel   : 4
> pinapple: 1

Looks clumsy, however. Isn't there a better way to handle this kind of situation?

2 Answers 2

17

Okay, problem solved already, here's the answer for future reference: variables can be nested, so this works perfectly fine:

for item, qty in cart.items():
    print "{0:{1}} - {2}".format(item, column_width, qty)
Sign up to request clarification or add additional context in comments.

4 Comments

Yes, this is one of the reasons that .format() is preferred to % format strings
Afaik % is considered deprecated and will be removed in future versions of Python 3, although no actual deadline has been announced yet.
The word to search for in the docs is "nesting" which is hard to remember when you don't already know the answer ;)
@ManuelEbert It has will be deprecated but I'd say it's very unlikely to be removed in our lifetimes as the cost of removing it is large and the benefit is small.
1

Since python 3.6 you can use f-strings resulting in more terse implementation:

>>> things = {"car": 4, "airplane": 1, "house": 2}
>>> width = max(len(thing) for thing in things)
>>> for thing, quantity in things.items():
...     print(f"{thing:{width}} : {quantity}")
... 
car      : 4
airplane : 1
house    : 2
>>> 

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.