使用 argparse 是否可以使先前定义的参数成为必需的?
With argparse is it possible to make previously defined arguments required?
我目前正在为几个相关脚本定义一组命令行参数,我希望它们对给定的上下文使用相同的参数,而不必 copy/paste 相应的部分。
在某些情况下,给定的参数是可选的,而在其他情况下它是必需的,所以我不能只设置一个通用的参数解析器并在所有脚本中使用它。
一种方法是使用一个函数 create_argument_parser(flags)
,它根据给定的标志创建一个解析器。
另一种方法是先定义一个参数解析器,然后根据我的需要进行修改。
有没有办法先定义一组参数,然后再使它们成为 optional/required?
In [1]: import argparse
argparse
是用 Python 的 class 结构编写的,因此大多数命令生成的对象可以被检查,并在有限的程度上进行修改。但要明智地这样做。不要害怕编写自己的实用函数,如果有帮助,甚至 classes。
首先我们创建一个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
列表中。它还 returns 它,我们可以保留该引用。
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
默认为 required
。 optionals
不是,尽管我们可以指定该参数,创建 'required optional'.
但是由于 required
是 Action
的一个简单属性,我们可以更改它:
In [11]: a2.required=True
In [12]: parser.print_usage()
usage: ipython3 [-h] --bar BAR foo
因此,无论您是使用实用程序脚本来创建解析器,还是进行这样的修改,都取决于您。这种修改路线可能更难maintain/debug。使用 parents
机制创建多个(子)解析器时,对属性更改要格外小心。
我目前正在为几个相关脚本定义一组命令行参数,我希望它们对给定的上下文使用相同的参数,而不必 copy/paste 相应的部分。
在某些情况下,给定的参数是可选的,而在其他情况下它是必需的,所以我不能只设置一个通用的参数解析器并在所有脚本中使用它。
一种方法是使用一个函数 create_argument_parser(flags)
,它根据给定的标志创建一个解析器。
另一种方法是先定义一个参数解析器,然后根据我的需要进行修改。
有没有办法先定义一组参数,然后再使它们成为 optional/required?
In [1]: import argparse
argparse
是用 Python 的 class 结构编写的,因此大多数命令生成的对象可以被检查,并在有限的程度上进行修改。但要明智地这样做。不要害怕编写自己的实用函数,如果有帮助,甚至 classes。
首先我们创建一个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
列表中。它还 returns 它,我们可以保留该引用。
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
默认为 required
。 optionals
不是,尽管我们可以指定该参数,创建 'required optional'.
但是由于 required
是 Action
的一个简单属性,我们可以更改它:
In [11]: a2.required=True
In [12]: parser.print_usage()
usage: ipython3 [-h] --bar BAR foo
因此,无论您是使用实用程序脚本来创建解析器,还是进行这样的修改,都取决于您。这种修改路线可能更难maintain/debug。使用 parents
机制创建多个(子)解析器时,对属性更改要格外小心。