如何在 parser.add_argument 之后设置 argparse 参数

问题描述 投票:0回答:1

我有一个 python 函数,它自动为其他 python 程序构建 argparse 解析器,需要使用 parser.add_argument 动态创建一个参数,但在一些小众用例中需要检查程序是否要为此参数添加一个非常具体的选项示例将 choices 选项添加到参数中,而不是检查 if,如果程序想要将选项添加到参数中并使用此选项创建参数,那么我想使用 parser.add_argument 创建参数,然后将其设置为 if需要 如果有 pythonic/argsparse 方法可以做到这一点,这是我希望做的一个例子: 选项 1

parser.add_argument('-e', '--example')
if add_choices:
    parser.set_argument('-e', choices=['example1', 'example2'])

这是我尽量避免的选择 选项 2

if add_choices:
    parser.add_argument('-e', '--example', choices=['example1', 'example2'])
else:
    parser.add_argument('-e', '--example')

这可能吗?还是我必须坚持选项 2? 感谢所有回答的人!

我查看了 argparse 文档,几乎期望会有一个函数使用它的名称设置参数(如示例“-e”)但没有找到任何东西。

此外,我在堆栈溢出中搜索并发现了一个类似的问题,但没有解决我的问题argparse update choices of an argument 因为它假设编辑选择选项(并且在运行代码之后它甚至没有按预期工作也就是它不改变选择和参数)并且不创建它或任何其他选项(例如它不改变动作,类型等等,即使它确实触及了我的主要问题)。

(显然问了 chatgpt 但无济于事,他一直用不正确的代码带领我绕圈子)。

python-3.x argparse
1个回答
0
投票

我看不出选项 2 有什么问题;

if/else
是非常好的 python 构造。

但是如果你坚持你可以做类似的事情

a = parser.add_argument('-e', '--example')
if add_choices:
a.choices = ['example1', 'example2']

a
是由
Action
创建的
add_argument
对象。执行
print(a)
以查看其某些属性的显示。您可以在一定范围内,在创建对象后修改这些属性。

parser._action
列表中也引用了该操作。在普通的解析器设置中,我们不会依赖
add_argument
返回的引用,但是当以编程方式构建解析器或使用实用函数时,保留您自己的
Actions
列表可能会很方便。

但是等等,我只是重复你链接中的答案,包括我的:)

如果你改变

conflict_handler

,你也许可以使用第一个模式

https://docs.python.org/3/library/argparse.html#conflict-handler

该模式与“-e”标志冲突。默认处理程序引发错误。 “解决”选项将从第一个中删除“-e”,留下“--example”,并使用“-e”创建一个新操作。

编辑

你说想使用参数“name”,比如“-e”。但这并不是真正的动作名称,它只是它的一个

option_strings
.

正如我在上面写的

add_argument
创建一个
Action
实例:

In [3]: a = parser.add_argument('-e','--example')

该实例的一些属性可以通过它的

repr
显示看到:

In [4]: a
Out[4]: _StoreAction(option_strings=['-e', '--example'], dest='example', nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)

dest
是将值添加到
args
命名空间时将使用的名称。这通常是从选项字符串中推导出来的,但可以明确设置。并且可以重复。

所有这些其他属性都可以在创建后更改,正如我用

choices
展示的那样。

请注意,

option_strings
包含标志字符串。对于
positional
,该列表将为空。并且尝试添加另一个
-e
参数将导致对该
-e
标志的冲突,何时可以解决。

parser
有一个
Actions
_actions
以及
dict
配对标志及其动作的列表:

In [5]: parser._option_string_actions
Out[5]: 
{'-h': _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, required=False, help='show this help message and exit', metavar=None),

 '--help': _HelpAction(option_strings=['-h', '--help'], dest='help', nargs=0, const=None, default='==SUPPRESS==', type=None, choices=None, required=False, help='show this help message and exit', metavar=None),

 '-e': _StoreAction(option_strings=['-e', '--example'], dest='example', nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None),

 '--example': _StoreAction(option_strings=['-e', '--example'], dest='example', nargs=None, const=None, default=None, type=None, choices=None, required=False, help=None, metavar=None)}

在这个字典中,值是动作(引用)。在这个例子中只有两个,默认帮助和

example
。对于每个 option_string,此 dict 中将出现一次操作。这个
dict
在解析过程中用于识别将使用哪个 Action 来处理每个用户提供的标志。它也在冲突处理期间使用。但是没有任何公共方法适用于此
dict
.

© www.soinside.com 2019 - 2024. All rights reserved.