有什么方法可以在ArgParser中没有任何前缀的情况下设置选项?
题
我正在使用ArgParser来处理我的CLI Prog的参数。但是随着时间的流逝,我认为使用它不是一个好主意。有问题。我想使用没有任何前缀字符的选项。喜欢 git承诺 或者 SVN移动. 。我已经搜索了一点,发现ArgParse具有add_subparser()方法。让我们填充我们的 foo prog:
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
现在让使用选项执行foo并打印 args
名称空间(我没有过去的整个代码,您明白了):
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
如您所见,如果我执行选项 del
, add_project 未传递给变量 args
. 。如果我在main()函数中有“ if子句”,那会导致问题
def main(args):
if args.delete_project:
...
if args.add_project:
...
我会得到一个 属性 例外,名称空间没有名称的属性 add_project 如果我执行 ./foo del
. 。除此之外,我无法将任何论点传递给选项 del
和 add
. 。我还将prefix_chars设置为一个空字符串,这也不起作用。
什么是处理它? ArgParse是否能够创建诸如Git,SVN等的选项。还是我应该创建自己的功能并自己处理所有参数?
解决方案
而不是您的if语句 ArgParse文档推荐这样的东西:
parser_X.set_defaults(action=action_func)
args.action(args)
然后,add_action将查看add_project和del_project的del_action。
其他提示
编辑:显然是 default
是 None
, ,这意味着我们没有一个,所以您必须使用 True
和 False
(无论如何,这是正确的方式)。
您需要添加 default
当您将论点添加到解析器时:
parser_a.add_argument('-ap', '--add-project',
nargs = '*',
action = 'store_true',
default = False,
help = "Add project")
您可以看到 add_argument
方法 这里. 。 (我意识到 argparse
DOC布局并不是最有利于弄清楚如何在示例中进行未调用的事情)
另外,正如托布(Tobu)在他的答案中正确指出的那样,未使用的地下主角不会被调用,因此您至少在没有保护您的代码的情况下就无法安全探测其价值 try:
堵塞。但是,实际上您应该使用关联的功能 action
除非您需要共享状态的情况更复杂,否则就有您的地下主题。