使用互斥组参数作为函数标志

Using mutually exclusive group arguments as flags of function

我编写了以下程序,其中 objective 是根据互斥参数列出特定类型的项目。

def run():
    parser = argparse.ArgumentParser(description='List Items')
    group = parser.add_mutually_exclusive_group(required=True)
    sub_parsers = parser.add_subparsers(help='list commands')
    listItems_parser = sub_parsers.add_parser('listitem', help='List items in the directory')
    listItems_parser.add_argument('-s','--source_dir', help='Source Directory',required = True)
    listItems_parser = group.add_argument('-t','--tonic',help='List Tonic', action ='store_true')
    listItems_parser = group.add_argument('-c','--capsule',help='List Capsule', action ='store_true')
    listItems_parser.set_defaults(func=run_iList_commands)

    args = parser.parse_args()
    args.func(args)

但是当我运行程序时,我得到以下错误:

AttributeError: '_StoreTrueAction' object has no attribute 'set_defaults'

请帮助我理解问题。

此语句创建一个解析器,您将其分配给 listItemss_parser

listItems_parser = sub_parsers.add_parser('listitem', help='List items in the directory')

这会在该解析器中创建一个参数 (Action)。

listItems_parser.add_argument('-s','--source_dir', help='Source Directory',required = True)

这也创建了一个参数,Action 对象,但是在 group 中(之前定义为主要 parser 的一部分)。

并且由于某些未知原因,您将此对象分配给您之前用于子解析器的相同变量名。为什么?您是否尝试将此参数添加到该子解析器?

listItems_parser = group.add_argument('-t','--tonic',help='List Tonic', action ='store_true')

相同类型的参数赋值:

listItems_parser = group.add_argument('-c','--capsule',help='List Capsule', action ='store_true')

请记住,listItems_parser 现在是 Action,而不是 parser - 因此出现错误。

listItems_parser.set_defaults(func=run_iList_commands)

我怀疑你想做这样的事情:

group = listItems_parser.add_multually....
group.add_argument(...)
group.add_argument(...)

换句话说,将 group 定义在子解析器中。


listItems_parser.set_defaults(func=run_iList_commands)
args = parser.parse_args(['listitem',...])

当 'listitem' 在命令行中时,listItems_parser 是 运行,并且它为为其定义的所有参数设置默认值和值。由于这个 set_defaults 命令,args 命名空间将包含一个 func 项。 (我认为这在文档中有说明)。

换句话说,args 看起来像(打印):

Namespace(func=run_iList_commands, source_dir=..., tonic=..., capsule=....)

所以这一行:

args.func(args)

最终调用 run_iList_commands 函数,它得到这个命名空间作为参数。在这个函数里面它可以做:

args.source.dir...
if args.tonic:
   etc

我强烈建议 运行在交互式会话中使用它或更简单的东西,并打印各种值。在这样的会话中看到发生了什么比解释它们更容易。