【问题标题】:Is it possible to validate `argparse` default argument values?是否可以验证 argparse 默认参数值?
【发布时间】:2023-01-11 21:59:25
【问题描述】:

是否可以告诉 argparse 在默认参数值上给出与在用户指定的参数值上相同的错误?

例如,以下不会导致任何错误:

parser = argparse.ArgumentParser()
parser.add_argument('--choice', choices=['a', 'b', 'c'], default='invalid')

args = vars(parser.parse_args())            # args = {'choice': 'invalid'}

而省略默认值并让用户在命令行上指定 --choice=invalid 将导致错误(如预期的那样)。

询问的原因是我希望用户能够在 JSON 文件中指定默认命令行选项,然后使用 ArgumentParser.set_defaults() 进行设置,但不幸的是,这会阻止验证这些用户指定的默认值。

【问题讨论】:

  • 为什么不预处理并检查默认值是否在列表中?在运行时检查默认值是否是选择的一部分在逻辑上毫无意义。我的意思是,通常你应该设置两者......
  • @Tomerikoo,在我已经声明我认为有效输入作为设置解析器的一部分的意义上,这将涉及重复我自己。在上面的示例中,它将涉及检查选择是否是列表的一部分。但是对于布尔选项,例如我需要验证用户指定的值实际上是一个布尔值。简而言之,它将涉及复制解析器中已经存在的所有验证逻辑。

标签: python


【解决方案1】:

我花时间深入研究了the source code,发生的事情是只对您在命令行上提供的参数进行检查。在我看来,执行检查的唯一方法是子类化 ArgumentParser 并在添加参数时让它进行检查:

class ValidatingArgumentParser(argparse.ArgumentParser):
    def add_argument(self, *args, **kwargs):
        super().add_argument(args, kwargs)
        self._check_value(self._actions[-1],kwargs['default'])

【讨论】:

    【解决方案2】:

    否。需要验证显式参数,因为它们源自外部源代码。默认值起源源代码,所以这是程序员的工作,而不是参数解析器,以确保它们是有效的。

    (这是两者之间的区别验证调试.)

    (在未经验证的用户输入上使用 set_defaults 仍然属于调试范围,因为它不是参数解析器本身添加默认值,而是程序员。)

    【讨论】:

    • 对不起,但我不买这个。 parse_args() 可以用 args 的列表调用(也许来自源代码,谁知道呢),然后 ArgumentParser 会愉快地验证它。
    猜你喜欢
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 2018-03-26
    • 2015-09-28
    • 2014-12-07
    • 2017-05-11
    • 2017-10-13
    • 1970-01-01
    相关资源
    最近更新 更多