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