我正在使用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. 。除此之外,我无法将任何论点传递给选项 deladd. 。我还将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。

其他提示

编辑:显然是 defaultNone, ,这意味着我们没有一个,所以您必须使用 TrueFalse (无论如何,这是正确的方式)。

您需要添加 default 当您将论点添加到解析器时:

parser_a.add_argument('-ap', '--add-project',
                    nargs = '*',
                    action = 'store_true',
                    default = False,
                    help = "Add project")

您可以看到 add_argument 方法 这里. 。 (我意识到 argparse DOC布局并不是最有利于弄清楚如何在示例中进行未调用的事情)

另外,正如托布(Tobu)在他的答案中正确指出的那样,未使用的地下主角不会被调用,因此您至少在没有保护您的代码的情况下就无法安全探测其价值 try: 堵塞。但是,实际上您应该使用关联的功能 action 除非您需要共享状态的情况更复杂,否则就有您的地下主题。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top