我试图在脚本中添加一个参数依赖项。其思想是--clone参数将需要非空的--gituser。在
在仔细阅读了this example之后,我尝试了以下方法
In [93]: class CloneAction(argparse.Action):
...: def __call__(self, parser, namespace, _):
...: if not namespace.git_user and namespace.clone:
...: parser.error('"--clone" requires legal git user')
...:
In [94]: parser = argparse.ArgumentParser()
In [95]: parser.add_argument('-g', '--gituser', dest='git_user', type=str, default='', action=CloneAction)
Out[95]: CloneAction(option_strings=['-g', '--gituser'], dest='git_user', nargs=None, const=None, default='', type=<type 'str'>, choices=None, help=None, metavar=None)
In [96]: parser.add_argument('--clone', action='store_true', default=False)
Out[96]: _StoreTrueAction(option_strings=['--clone'], dest='clone', nargs=0, const=True, default=False, type=None, choices=None, help=None, metavar=None)
唉,这没用
^{pr2}$我做错什么了?在
这种参数间依赖关系在解析后更容易实现。在
此时,}都已被解析,并有它们的最终值。在
git_user
和{当您实现它时,只有当有一个
gituser
参数时,才会运行自定义操作。所以我认为当你给它gituser
而没有clone
时,它会引起错误。在您可以给
clone
一个类似的自定义操作,但它还必须处理store_true
的详细信息。那么clone gituser value
序列会发生什么呢?在分析clone
值之前,clone
操作将运行。像这样的测试会遇到一些棘手的论证顺序问题。在还有几个问题:
您的自定义操作不存储任何值,不管是否存在错误。最好自定义
store
子类。自定义操作应引发
argparse.ArgumentError
,而不是直接调用parser.error
。unittest文件
test/test_argparse.py
有一个自定义操作的示例,其中包含这样的相互测试。但这只是一个玩具,验证这样的代码是允许的。在=================
{{cd16>你可以实现 gituser,则
parse_args
的最终required
操作测试将引发错误。但这需要保存对out[95]
中显示的操作的引用(或者在parse._actions
列表中找到它)。可行但混乱。在=================
下面是一个来自
^{pr2}$test/test_argparse.py
的一对交互自定义操作类的示例。在NS
是argparse.Namespace
的简写。在它们用于
应该与:
这是一个可以进行交叉检查的例子。但我要重复一次,一般来说,交互最好是在解析之后处理,而不是在解析期间。在
至于实现问题-如果用户没有给您}。在
gituser
,您的自定义操作永远不会被调用。只有在使用参数时才使用optional
的Action.__call__
。positionals
总是使用,但不是{相关问题 更多 >
编程相关推荐