python-3.x 如何在parser之后设置argparse参数,添加变元

blmhpbnm  于 2023-05-02  发布在  Python
关注(0)|答案(1)|浏览(134)

我有一个python函数,它可以为其他python程序自动构建argparse解析器,并且需要使用parser动态创建一个参数。add_argument但在某些特定的用例中,需要检查程序是否要为该参数添加一个非常特定的选项,例如将choices选项添加到参数中,而不是检查if,如果程序要为参数添加option并使用此选项创建参数,则相应地我想使用parser创建参数。add_argument然后在需要时设置它这里是一个例子,如果有一个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')

这可能吗?还是我必须坚持选择二感谢所有回答的人!
我查看了argparse文档,几乎期望会有一个函数使用它的名称设置参数(例如'-e'),但没有找到任何东西。
此外,我在堆栈溢出中搜索,发现了一个类似的问题,但没有解决我的问题argparse update choices of an argument,因为它假设编辑选择选项(在运行代码后,它甚至没有按预期工作,也就是说,它没有改变和参数的选择),而不是创建它或任何其他选项(例如,它没有改变动作,类型等,即使它的doas触及我的主要问题)。
(and显然问了chatgpt,但无济于事,他一直用不正确的代码引导我兜圈子)。

qyzbxkaa

qyzbxkaa1#

我看不出第二个选择有什么错if/else是一个非常好的python结构。
但如果你坚持你可以做一些

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

a是由add_argument创建的Action对象。执行print(a)以查看其某些属性的显示。创建对象后,可以在一定范围内修改这些属性。
该操作也在parser._action列表中引用。在普通的解析器设置中,我们不会保留add_argument返回的引用,但是当以编程方式或使用实用函数构造解析器时,保留您自己的Actions列表可能会很方便。
但是等等,我只是在重复你的链接中的答案,包括我的:)
如果更改conflict_handler,则可能能够使用第一种模式。
https://docs.python.org/3/library/argparse.html#conflict-handler
该模式与“-e”标志冲突。默认处理程序引发错误。'resolve'替代方案将从第一个中删除'-e',留下'--example',并使用'-e'创建一个新的Action。

编辑

你谈到想要使用参数“name”,比如'-e'。但这并不是Action的真正名称,它只是它的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_actionsdict配对标志及其操作的列表:

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)}

在这个字典中,值是Actions(引用)。在这个例子中只有两个,默认的帮助和example。对于每个option_string,此字典中将出现一次操作。这个dict在解析过程中用于识别哪个Action将用于处理每个用户提供的标志。它也用于冲突处理。但是没有任何公共方法可以使用这个dict

相关问题