是否可以删除或禁用 argparse 中的参数,使其不显示在帮助中?如何?
添加新参数很容易:
parser = argparse.ArgumentParser()
parser.add_argument('--arg1', help='Argument 1')
parser.add_argument('--arg2', help='A second one')
而且我知道您可以通过指定“解决”冲突处理程序来使用新定义覆盖参数:
#In one script that should stand-alone and include arg1:
parser = argparse.ArgumentParser(conflict_handler='resolve')
parser.add_argument('--arg1', help='Argument 1')
parser.add_argument('--arg2', help='A second one')
#In another script with similar options
parser.add_argument('--arg1', help='New number 1')
但这仍然包括帮助消息中的arg1和 parse_args
的结果—有没有类似的东西
#Wishful thinking
#In another script with similar options, that shouldn't include arg1
parser.remove_argument('--arg1')
或者另一种相当简单的方法来实现这一目标?
另外:如果参数是位置参数,方法会有所不同吗?
注意:按照 此处 的建议进行解析后删除 arg1
的问题是该参数仍然显示在帮助中
原文由 Bryan P 发布,翻译遵循 CC BY-SA 4.0 许可协议
尽管我在下面提到了错误问题,但您对
resolve
的使用提出了一种可能的方法。这不适合新手或需要坚持使用公共 API 的人。parser
有一个动作(参数)对象列表(由add_argument
创建)。使用您的第二个解析器定义,它的
_actions
列表是:当您添加一个与
resolve
冲突的动作时,它会删除现有的冲突动作。详情请看_handle_conflict_resolve
方法。但我可以愚弄它,让它在不添加新动作的情况下删除一个动作。查看
_actions
并帮助验证--arg1
消失了。resolve
只是处理optionals
,标志字符串可能会发生冲突。它首先删除冲突的标志,只有在没有标志保留时才删除冲突的操作。因此,当您同时拥有空头和多头选项时,要格外小心。这并没有解决位置问题。他们没有标志,他们可能共享
dest
参数。 (尽管只有一个会出现在结果中,除非他们正在附加操作)。多玩一点,看起来我可以删除这些新位置之一:
如果我选择
_actions[-2]
我会删除第一个foo
。如果我将add_argument
返回的值分配给变量,例如foo1
,我可以使用它而不是在parser._actions
列表中查找值在交互式 shell(我使用 IPython)中运行示例解析器并查看这些对象可能会有所帮助。同样,这似乎适用于一个简单的示例,但如果用于更复杂的东西(或用于生产),则需要仔细测试。
该主题是几年前针对 Python 错误/问题提出的:
http://bugs.python.org/issue19462
Add remove_argument() method to argparse.ArgumentParser
我讨论了完全移除的困难,并提出了一些替代方案。
argparse.SUPPRESS
可用于隐藏帮助。optionals
如果不需要,可以忽略。positionals
比较棘手,尽管我建议调整它们的属性(nargs
和default
)。但是已经有一段时间了,所以我需要查看这些帖子。=============================
我很好奇
@2rs2ts
问题(见评论)。我制作了一个解析器,然后将其用作另一个解析器的父级(无需使用子解析器机制)。然后我从一个解析器中删除了一个参数,并查看了另一个解析器中的变化。
使用一个参数创建父解析器:
制作另一个
parents
:请注意,两个解析器的第二个操作相同(相同的 ID)。
parents
只是复制了对原件的引用--foo
动作,它没有复制。现在从一个解析器中删除’–foo’,使用我之前制定的技巧:
’–foo’ 已从
p1
列表中消失,但仍存在于p
列表中。但是option_strings
现在是空的。The
resolve
code removed conflictingoption_strings
from the--foo
action, and then removed it from thep1._actions
list.但是改变option_strings
为p1
参考也改变了p
参考。argparse
uses a couple of ways to distinguishpositionals
fromoptionals
, but the one used most often in parsing is to look at whether theoption_strings
属性是否为空。通过清空此属性,resolve
有效地将optional
变成了positional
。糟糕,我的记忆力不对。:) 一年前我回答了一个类似的问题,涉及
parents
和resolve
https://stackoverflow.com/a/25821043/901925
argparse conflict resolver for options in subcommands turns keyword argument into positional argument