我似乎无法找到一种简单的方法来制作代码,找到要格式化的项目数量,询问用户参数,并将其格式化为原始形式。
我尝试做的一个基本示例如下(用户输入在">>>"之后开始):
>>> 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())来显示格式化的输入:
Hello Zero Goodbye One
然而,如果表单有3个参数,它将要求参数0、1和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
这是我能想到的最基本的应用程序,它将使用可变数量的东西来格式化。我已经学会了如何使用vars()根据需要生成变量,但由于string.format()不能接收列表、元组或字符串,我似乎无法使".format"适应要格式化的内容的数量。
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)
最简单的方法是简单地尝试使用您所拥有的任何数据进行格式化,如果您获得了IndexError
,则您还没有足够的项目,因此要求另一个。将项目保存在列表中,并在调用format()
方法时使用*
表示法对其进行解压缩。
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
这里有一个修改后的kindall的答案,它允许非空格式字符串的空结果:
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
您只需要在最后一个参数名称前面使用*,随后的所有参数名称都将分组到该名称中。然后,您可以根据需要对该列表进行迭代。
如何在Python 中创建变量参数列表