Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Formatting using a variable number of .format( ) arguments in Python

I can't seem to figure out a straightforward way to make code that finds the number of items to format, asks the user for the arguments, and formats them into the original form.

A basic example of what I'm trying to do is as follows (user input starts after ">>> "):

>>> test.py
What is the form? >>> "{0} Zero {1} One"
What is the value for parameter 0? >>> "Hello"
What is the value for parameter 1? >>> "Goodbye"

The program would then use print(form.format()) to display the formatted inputs:

Hello Zero Goodbye One

However if the form had 3 arguments, it would ask for parameters 0, 1 and 2:

>>> test.py (same file)
What is the form? >>> "{0} Zero {1} One {2} Two"
What is the value for parameter 0? >>> "Hello"
What is the value for parameter 1? >>> "Goodbye"
What is the value for parameter 2? >>> "Hello_Again"
Hello Zero Goodbye One Hello_Again Two

This is the most basic application that I can think of that would use a variable amount of things to format. I have figured out how to make variables as I need them using vars() but as string.format() can't take in lists, tuples, or strings, I can't seem to make ".format()" adjust to the number of things there are to format.

like image 656
Razz Abuiss Avatar asked Sep 11 '26 07:09

Razz Abuiss


2 Answers

fmt=raw_input("what is the form? >>>")
nargs=fmt.count('{') #Very simple counting to figure out how many parameters to ask about
args=[]
for i in xrange(nargs):
    args.append(raw_input("What is the value for parameter {0} >>>".format(i)))

fmt.format(*args)
          #^ unpacking operator (sometimes called star operator or splat operator)
like image 61
mgilson Avatar answered Sep 12 '26 21:09

mgilson


The easiest way is to simply try to format using whatever data you have, and if you get an IndexError you don't have enough items yet, so ask for another one. Keep the items in a list and unpack it using the * notation when calling the format() method.

format = raw_input("What is the format? >>> ")
prompt = "What is the value for parameter {0}? >>> "
parms  = []
result = ""
if format:
    while not result:
        try:
            result = format.format(*parms)
        except IndexError:
             parms.append(raw_input(prompt.format(len(parms))))
print result
like image 41
kindall Avatar answered Sep 12 '26 22:09

kindall



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!