首页 > 解决方案 > 使用 argparse 是否可以使先前定义的参数成为必需?

问题描述

我目前正在为几个相关脚本定义一组命令行参数,我希望它们对给定的上下文使用相同的参数,而不必复制/粘贴相应的部分。

在某些情况下,给定的参数是可选的,而在其他情况下它是必需的,因此我不能只设置一个通用参数解析器并在所有脚本中使用它。

一种方法是拥有一个create_argument_parser(flags)基于给定标志创建解析器的函数。

另一种方法是首先定义一个参数解析器并根据我的需要对其进行修改。

有没有办法先定义一组参数,然后使它们成为可选/必需的?

标签: pythonargparse

解决方案


In [1]: import argparse

argparse是用 Python 的类结构编写的,因此大多数命令都会生成可以检查的对象,并且可以进行有限程度的修改。但要明智地这样做。不要害怕编写自己的实用程序函数,如果有帮助的话,甚至可以编写类。

首先我们创建一个parser对象:

In [2]: parser = argparse.ArgumentParser()
In [3]: parser
Out[3]: ArgumentParser(prog='ipython3', usage=None, description=None, formatter_class=<class 'argparse.HelpFormatter'>, conflict_handler='error', add_help=True)

add_argument创建一个Action对象,并将其放在parser._actions列表中。它也返回它,我们可以保留该引用。

In [4]: a1 = parser.add_argument('foo')
In [5]: a1
Out[5]: _StoreAction(option_strings=[], dest='foo', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [6]: a1.required
Out[6]: True
In [7]: a2 = parser.add_argument('--bar')
In [8]: a2
Out[8]: _StoreAction(option_strings=['--bar'], dest='bar', nargs=None, const=None, default=None, type=None, choices=None, help=None, metavar=None)
In [9]: a2.required
Out[9]: False
In [10]: parser.print_help()
usage: ipython3 [-h] [--bar BAR] foo

positional arguments:
  foo

optional arguments:
  -h, --help  show this help message and exit
  --bar BAR

positionals是,默认情况下requiredoptionals不是,尽管我们可以指定该参数,创建一个“必需的可选”。

但既然required是 的一个简单属性,Action我们可以改变它:

In [11]: a2.required=True
In [12]: parser.print_usage()
usage: ipython3 [-h] --bar BAR foo

因此,您是使用实用程序脚本来创建解析器,还是进行这样的修改,都取决于您。这种修改路线可能更难维护/调试。parents在使用该机制创建多个(子)解析器时,要格外小心进行属性更改。


推荐阅读