我有一个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,但无济于事,他一直用不正确的代码引导我兜圈子)。
1条答案
按热度按时间qyzbxkaa1#
我看不出第二个选择有什么错
if/else
是一个非常好的python结构。但如果你坚持你可以做一些
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
示例:该示例的一些属性可以通过其
repr
显示器看到:dest
是将值添加到args
命名空间时将使用的名称。这通常是从选项字符串推导出来的,但也可以显式设置。并且可以被复制。所有这些其他属性都可以在创建后更改,如我在
choices
中所示。注意
option_strings
包含标志字符串。对于positional
,该列表将为空。尝试添加另一个-e
参数将导致-e
标志冲突,此时可能会解决。parser
有一个Actions
、_actions
和dict
配对标志及其操作的列表:在这个字典中,值是Actions(引用)。在这个例子中只有两个,默认的帮助和
example
。对于每个option_string,此字典中将出现一次操作。这个dict
在解析过程中用于识别哪个Action将用于处理每个用户提供的标志。它也用于冲突处理。但是没有任何公共方法可以使用这个dict
。