如何解决使用argparse的有序和重复标志
尝试使用argparse实现CLI,如果可能的话,不编写自己的解析器。基本上,我想使用命令行来顺序调用程序中的不同方法,即:
tsc-watch
我见过一些关于如何获取有序参数的好主意,但是我想我最终会得到一个像my_program.py --doA --doB --doA --doA
这样的列表,我仍然需要自己解析参数。
有什么方法可以利用argparse中的工具来帮助按顺序执行这些命令?谢谢!
解决方法
命令行参数可以分为3组:
- 选项-以
-
或--
为前缀,通常指定命令的行为方式(--verbose
),可以或可以不使用值,通常顺序无关紧要 - 子命令-是少数几个程序定义的关键字之一,它们告诉程序执行程序完整功能的某个子集(
pull
中的git pull
),通常只能在以下位置指定一个时间 - 参数-通常在命令末尾传递值,并指定执行期间要使用的值,通常这些值被简单使用而无需任何修改
大多数参数解析器将选项视为无序的,并且倾向于将值简单地设置为命名空间中的变量或属性,以供程序员使用。这使得通常不编写自定义解析器就无法使用有序选项。
对于您的工具,您只想指定要执行的操作的有序列表,因此将它们作为值传递给选项或简单参数可能更有意义。
my_program.py --actions doA doB doC doD
my_program.py doA doB doC doD
Argparsers(例如python的argparse
)不会更改赋予选项的值或作为参数传递的值,这意味着将保留操作的顺序。
这里是一个解析器,它将按顺序重复收集这些参数:
In [1]: import argparse
In [2]: parser = argparse.ArgumentParser()
In [3]: parser.add_argument('--doA',dest='cmd',const='doA',action='append_con
...: st');
In [4]: parser.add_argument('--doB',const='doB',action='append_con
...: st');
测试:
In [5]: args = parser.parse_args('--doA --doB --doA --doA'.split())
In [6]: print(args)
Namespace(cmd=['doA','doB','doA','doA'])
做点什么:
In [7]: for action in args.cmd:
...: print('action:',action)
...:
action: doA
action: doB
action: doA
action: doA
如果我已经定义:
def doA(*args):
# do something
pass
并使用const=doA
,则args.cmd
列表将
Namespace(cmd=[doA,doB,...])
我们可以写
for action in args.cmd:
action(arguments)
argparse
文档具有类似以下内容的子表达式和set_default
命令。
如果您接受这些唯一论点,那就太过分了。但是,如果还有其他需要使用argparse
的选项,则可以满足要求。但是接受一个
parser.add_argument('--cmd',nargs='*',...)
会没事的。它可以使用choices
来限制输入字符串,甚至可以使用type
函数来将字符串转换为函数对象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。