使用互斥组参数作为函数标志
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
我强烈建议 运行在交互式会话中使用它或更简单的东西,并打印各种值。在这样的会话中看到发生了什么比解释它们更容易。
我编写了以下程序,其中 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
我强烈建议 运行在交互式会话中使用它或更简单的东西,并打印各种值。在这样的会话中看到发生了什么比解释它们更容易。