argparse更新参数的选择

时间:2018-11-28 16:29:47

标签: python argparse

使用argparse,在将参数添加到解析器后,是否有任何方法可以更新该参数的“ choices”选项? Argparse documentation对于更新选择没有多大帮助

import argparse

parser = argparse.ArgumentParser()

choices_list = ['A', 'B']
parser.add_argument('arg1', choices=choices_list)

# The list of choices now changes 
choices_list = ['A', 'C', 'D']

# Some code to update 'arg1' choices option ?
parser.???

我尝试将'parser.add_argument'与新的'choices_list'结合使用,但是会创建重复的参数。

使用Python 3.7

2 个答案:

答案 0 :(得分:2)

自变量本身具有choices属性,但是如果您保存对自变量的引用而不是尝试从解析器本身中检索它,则最简单。 (否则,您必须浏览私有属性parser._actions并尝试确定所需的属性。)

import argparse

parser = argparse.ArgumentParser()

choices_list = ['A', 'B']
arg1 = parser.add_argument('arg1', choices=choices_list)

arg1.choices = ['A', 'B', 'D']

答案 1 :(得分:0)

看着https://github.com/python/typeshed/blob/master/stdlib/2and3/argparse.pyi

# undocumented
class _ActionsContainer:

    def add_argument(self,
                 ...
                 **kwargs: Any) -> Action: ...

    def add_argument_group(self, *args: Any, **kwargs: Any) -> _ArgumentGroup: ...

我不使用pycharm,但对于为什么会抱怨add_argument而不是add_argument_group感到困惑。

argparse文档未提及返回的Action对象,但这是因为用户通常不需要访问它。但是当进行交互式测试时,这很明显:

In [93]: import argparse
In [94]: parser = argparse.ArgumentParser()
In [95]: parser.add_argument('--foo', choices=['one','two'])
Out[95]: _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two'], help=None, metavar=None)
In [96]: _.choices
Out[96]: ['one', 'two']

以前的SO答案指出Actions也可以在“隐藏的” _actions列表中使用。但是在Python中,“ _”只是一个非正式约定。解释器不会强制执行隐私。

In [98]: parser._actions
Out[98]: 
[_HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, help='show this help message and exit', metavar=None),
 _StoreAction(option_strings=['--foo'], dest='foo', nargs=None, const=None, default=None, type=None, choices=['one', 'two'], help=None, metavar=None)]

显示的是Action对象的字符串表示形式。这些是最常用的属性。

argparse的文档不是正式的API参考;太不完整了。它更像是一个高级的how-to文档,比教程更复杂,但不如正式规范完整。