argpars中的交叉参数验证

2024-05-13 01:46:55 发布

您现在位置:Python中文网/ 问答频道 /正文

当参数的验证逻辑上依赖于从其他参数解析的值时,我正在寻找一种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()调用失败,也就是说,我们实际上是在参数解析过程中而不是在之后失败。在


Tags: pyaddparser参数my错误withscript
1条回答
网友
1楼 · 发布于 2024-05-13 01:46:55

分析后检查值是最简单的。您甚至可以使用parser.error('...')生成标准argparse格式的错误消息。在

argparse独立地处理每个参数,并尝试以不关心顺序的方式(除了positionals)这样做。每个输入值通过相应的Action对象(其__call__方法)添加到args命名空间。默认的store操作只使用setattr(args, dest, value);而store_true则使用setattr(args, dest, True)。在

互斥组的处理方法是保持setseen_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

相关问题 更多 >