How to set Python .format() padding at runtime?

I'm new to python and trying to print formatted columns of array items to the screen. I found the .format() method which can use fixed-width padding to separate the columns.

$ ./format.py 
Num  EmpID Name     Team
1    23    Alex     Sales
2    10    Alan     Admin

This works OK until one of the items is longer than expected, or Num ends up longer than a single digit, or...:

./format.py 
Num  EmpID Name     Team
1    23    Alexandria Sales
2    10    Alan     Quality Assurance

What I'd like to do is loop over all the items in user_list and find the longest element (Quality Assurance in the code below) and tell .format() to pad all items based on that length. I haven't stumbled across a way to do this however.

Is there a way to define the .format() padding at runtime somehow?

    #!/usr/bin/python3

class user (object):
  __slots__ =  "name", "team", "empid"

  def __init__ (self):
    self.name        = None
    self.team        = None
    self.empid       = None

def print_menu (user_list):
   index = 0
   print ("{:<4} {:<5} {:<8} {}".format ("Num", "EmpID", "Name", "Team"))
   for person in user_list:
      index = index + 1
      print ("{:<4} {:<5} {:<8} {}".format (str(index), str(person.empid), person.name, person.team))


users=[]
new_user = user()

new_user.name = "Alexandria"
new_user.team = "Sales"
new_user.empid = "23"
users.append(new_user)

new_user = user()
new_user.name = "Alan"
new_user.team = "Quality Assurance"
new_user.empid = "10"
users.append(new_user)

print_menu (users)

Solution 1:

Absolutly, the trick is to know that you can nest the brackets {} in a format string. You would do this in place of the numbers 4,5,or 8 in a string like "{:<4} {:<5} {:<8} {}"

heres a quick example:

longestName = 8
someObj = (5,2)
print(f'_{str(someObj):<{longestName}}_')

That print results in : "_(5, 2) _" As you can see it has been padded to some integer we can get beforehand by just iterating over all the items and storing the longest item before printing.

Solution 2:

You can do this with f-strings. For example:

x = 1
d = 5

print(f'{x:0{d}}')

Output:

00001