当参数的验证逻辑上依赖于从其他参数解析的值时,我正在寻找一种python方法来验证参数。在
下面是一个简单的例子:
parser.add_argument(
'--animal',
choices=['raccoon', 'giraffe', 'snake'],
default='raccoon',
)
parser.add_argument(
'--with-shoes',
action='store_true',
)
在这种情况下,解析此命令会导致错误:
^{pr2}$在这里添加mutually exclusive group似乎没有帮助,因为其他组合也可以:
my_script.py --animal raccoon --with-shoes
my_script.py --animal raccoon
my_script.py --animal snake
my_script.py --animal giraffe --with-shoes
my_script.py --animal giraffe
理想情况下,验证错误不应该与--animal
参数或--with-shoes
参数相关联,因为接口无法告诉您需要在此处更改哪个值。每个值都是有效的,但不能组合使用。在
我们可以通过后处理args
名称空间来实现这一点,但是我正在寻找一种解决方案,它会导致parser.parse_args()
调用失败,也就是说,我们实际上是在参数解析过程中而不是在之后失败。在
分析后检查值是最简单的。您甚至可以使用
parser.error('...')
生成标准argparse
格式的错误消息。在argparse
独立地处理每个参数,并尝试以不关心顺序的方式(除了positionals
)这样做。每个输入值通过相应的Action
对象(其__call__
方法)添加到args
命名空间。默认的store
操作只使用setattr(args, dest, value)
;而store_true
则使用setattr(args, dest, True)
。在互斥组的处理方法是保持
set
为seen_actions
,并对照组自己的操作列表进行检查。我已经探索了将组泛化以允许其他逻辑操作组合。尽管这已经变得很复杂(尤其是在显示usage
)时,我并没有设想对值和发生率进行测试。在可以编写定制的
Action
类,检查是否同时出现,但这会变得更复杂。在我们可以给},而{}必须知道{}。解析后的测试允许您将逻辑放在一个位置。在
with-shoes
一个Action类,该类检查args.animal
属性的值,如果该值是snake
,则会引发错误。但是,如果用户首先提供with-shoes
选项呢?我们必须给animal
一个检查args.with_shoes
值的自定义类,如果是True
,则会引发一个错误,以此类推,shoes
必须知道{使用
argparse
这样的解析器的一大优点是它可以为您生成用法、帮助和错误消息。但是像这样的验证逻辑很难自动表达。事实上,相对简单的互斥逻辑的用法格式化是脆弱的,很容易被破坏。在早先试图回答这类问题:
Parameter dependencies in Python - can't make it work
相关问题 更多 >
编程相关推荐