我正在写一个小程序,涉及到使用parser.add_argument函数输入多达9个参数,这样太麻烦,要逐个输入9次因为一次输入的参数太多。我希望能有一个优化解决方案,一次输入多个参数,例如至少一次输入3个列数。
parser.add_argument('x1',type=int,help='输入x1所在列数') # 选择数组某一列
parser.add_argument('y1',type=int,help='输入y1所在列数')
parser.add_argument('z1',type=int,help='输入z1所在列数')
parser.add_argument('x2',type=int,help='输入x2所在列数')
parser.add_argument('y2',type=int,help='输入y2所在列数')
parser.add_argument('z2',type=int,help='输入z2所在列数')
parser.add_argument('x3',type=int,help='输入x3所在列数')
parser.add_argument('y3',type=int,help='输入y3所在列数')
parser.add_argument('z3',type=int,help='输入z3所在列数')
没有报错,可以运行,但太麻烦。
我尝试过使用input函数,但过不去,后面的代码不执行。
x1,y1,z1=eval(input("请输入x1,y1,z1所在列数,中间用逗号分开:"))
如果使用这一行代替parser.add_argument,后面的代码不执行。
我希望GUI界面简捷一些,一次能输入多个参数。如果需要,可以提供数据。
思路1:
比如想设置个参数,它可以接收多个整数值,那么可以在add_argument中设置action=“append”
import argparse
parser=argparse.ArgumentParser()
parser.add_argument("--foo",type=int,default=[],action="append")
opt=parser.parse_args()
print(opt.foo)
思路2:
不设置action,而是设置nargs=“+”,这样可以不用挨个值前面都跟一个–arg_name
import argparse
parser=argparse.ArgumentParser()
parser.add_argument("--foo",type=float,default=[],nargs="+")
opt=parser.parse_args()
print(opt.foo)
import argparse
class FooAction(argparse.Action):
def __init__(self, option_strings, dest, nargs=None, **kwargs):
if nargs is not None:
raise ValueError("nargs not allowed")
super().__init__(option_strings, dest, **kwargs)
def __call__(self, parser, namespace, values, option_string=None):
split = values.split(':')
for i in range(0, 3):
setattr(namespace, f'x{i + 1}', split[i * 3])
setattr(namespace, f'y{i + 1}', split[i * 3 + 1])
setattr(namespace, f'z{i + 1}', split[i * 3 + 2])
parser = argparse.ArgumentParser(description='Process some integers.')
parser.add_argument('--extend', action=FooAction)
args = parser.parse_args()
print(args)
可以将它包装成一个函数,参数是列表,通过for循环添加进去
parser = argparse.ArgumentParser ( description="test list" )
parser.add_argument ( '--weight', nargs = '+', type=int, default = [1,2,3,4,5,6,7,8,9], )
args = parser.parse_args()
x1,x2,x3,y1,y2,y3,z1,z2,z3=args.weight