使用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
答案 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文档,比教程更复杂,但不如正式规范完整。