我正在使用argparse作为我正在编写的python脚本.该脚本的目的是处理存储表格数据的大型ascii文件.该脚本只为我编写的类提供了一个方便的前端,允许在表格数据上进行任意数量的即时剪切.在类中,用户可以传入一个变量名关键字参数,其中包含绑定到变量的两元素元组.元组定义任何列的下限和上限,其名称对应于variable-name关键字.例如:
reader = AsciiFileReducer(fname, mass = (100, float("inf")), spin = (0.5, 1))
然后,此读取器实例将忽略输入fname的所有行,但质量> 100且0.5
我希望我写的脚本保留此功能,但我不知道如何允许使用argparse.add_argument添加带有变量名称的参数.我的类允许任意数量的可选参数,每个参数都有未指定的名称,其中为名称选择的字符串本身就是有意义的.python的**kwargs特性使这成为可能.argparse有可能吗?
通过argparse接受任意键:值对的问题已经出现过.例如:
使用带有**kwargs参数的函数的argparse
这有几个很长的答案与早期问题的链接.
另一种选择是获取一个字符串并使用JSON解析它.
但这里有一个快速选择nargs
,以及append
动作类型:
parser=argparse.ArgumentParser() parser.add_argument('-k','--kwarg',nargs=3,action='append')
一个示例输入,生成一个包含列表列表的命名空间:
args=parser.parse_args('-k mass 100 inf -k spin 0.5 1.0'.split()) Namespace(kwarg=[['mass', '100', 'inf'], ['spin', '0.5', '1.0']])
它们可以转换为带有以下表达式的字典:
vargs={key:(float(v0),float(v1)) for key,v0,v1 in args.kwarg}
可以传递给你的函数:
foo(**vargs) {'spin': (0.5, 1.0), 'mass': (100.0, inf)}