关于模板:使用Python中可变数量的.format()参数进行格式化

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

我似乎找不到一个简单的方法来制作代码,它可以找到要格式化的项目数量,向用户请求参数,并将它们格式化为原始表单。

我尝试做的一个基本示例如下(用户输入在">>>"之后开始):

1
2
3
4
>>> 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"

然后程序将使用print(form.format())显示格式化的输入:

1
Hello Zero Goodbye One

但是,如果表单有3个参数,它将要求参数0、1和2:

1
2
3
4
5
6
>>> 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

这是我能想到的最基本的应用程序,它将使用可变数量的东西来格式化。我已经知道如何使用vars()根据需要生成变量,但是作为string.format()不能接受列表、元组或字符串,我似乎无法使".format()"调整为要格式化的内容的数量。

编辑:处理此问题的最佳方法似乎是列出输入,并使用form.format(*list)格式化输入。谢谢大家!


1
2
3
4
5
6
7
8
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)


以下是修改后的Kindall答案,允许非空格式字符串的空结果:

1
2
3
4
5
6
7
8
9
10
11
12
format = raw_input("What is the format? >>>")
prompt ="What is the value for parameter {0}? >>>"
params  = []

while True:
    try:
        result = format.format(*params)
    except IndexError:
        params.append(raw_input(prompt.format(len(params))))
    else:
        break
print result


最简单的方法是简单地尝试使用您拥有的任何数据进行格式化,如果您得到一个IndexError,那么您还没有足够的项目,所以需要另一个项目。在调用format()方法时,将项目保存在一个列表中,并使用*符号将其解包。

1
2
3
4
5
6
7
8
9
10
11
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


您只需在最后一个参数名前面使用*即可,随后的所有参数名都将被分组到该参数名中。然后您可以根据需要迭代该列表。

如何在python中创建变量参数列表