Python Argparse:在'--帮助';?
假设我有以下argparse代码段:Python Argparse:在'--帮助';?,python,argparse,Python,Argparse,假设我有以下argparse代码段: diags.cmdln_parser.add_argument( '--scan-time', action = 'store', nargs = '?', type = int, default = 5, help = "Wait
diags.cmdln_parser.add_argument( '--scan-time',
action = 'store',
nargs = '?',
type = int,
default = 5,
help = "Wait SCAN-TIME seconds between status checks.")
当前,--help
返回:
用法:connection\u check.py[-h]
[--版本][--扫描时间[扫描时间]]
测试连接的可靠性/正常运行时间。
可选参数:
-h、 --帮助显示此帮助消息并退出
--版本显示程序的版本号并退出
--扫描时间[扫描时间]
状态检查之间等待扫描时间秒。
我更喜欢这样的:
--扫描时间[扫描时间]
状态检查之间等待扫描时间秒。
(默认值=5)
偷看一下帮助格式化程序代码,发现选项有限。有没有一种聪明的方法可以让argparse
以类似的方式打印--扫描时间的默认值,或者我应该只是将帮助
格式化程序子类化?使用:
要引用文档,请执行以下操作:
另一个可用的格式化程序类,ArgumentDefaultsHelpFormatter
,将添加关于每个参数的默认值的信息
请注意,这仅适用于定义了帮助文本的参数;如果参数没有help
值,则没有可向其添加有关默认值信息的帮助消息
然后,扫描时间选项的精确输出变为:
--scan-time [SCAN_TIME]
Wait SCAN-TIME seconds between status checks.
(default: 5)
将'%(默认)s'
添加到帮助参数以控制显示内容
parser.add_argument("--type", default="toto", choices=["toto","titi"],
help = "type (default: %(default)s)")
注释:
- 它是
%
+括号中的默认值+格式字符(不要与我们在格式
或f-string中找到的大括号{default}
混淆)
- 不要忘记在末尾为类型表示添加“说明符字符”(即字符串为
s
,整数为d
,浮点数为f
,等等)
- 您还可以添加常用的“printf”格式说明符(如浮点数、前导零等)
有关更多详细信息,请参阅。包装类
这是迄今为止我发现的最可靠、最枯燥的方法,可以同时显示默认值和使用另一个格式化程序,如argparse.RawTextHelpFormatter
:
#!/usr/bin/env python3
import argparse
class ArgumentParserWithDefaults(argparse.ArgumentParser):
def add_argument(self, *args, help=None, default=None, **kwargs):
if help is not None:
kwargs['help'] = help
if default is not None and args[0] != '-h':
kwargs['default'] = default
if help is not None:
kwargs['help'] += ' Default: {}'.format(default)
super().add_argument(*args, **kwargs)
parser = ArgumentParserWithDefaults(
formatter_class=argparse.RawTextHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.add_argument('--no-default', help='''my help
for no-default''')
parser.add_argument('--no-help', default=101)
parser.print_help()
print()
print(parser.parse_args())
输出:
usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
[--no-help NO_HELP]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a Default: 13
-b B my help
for b Default: 42
--no-default NO_DEFAULT
my help
for no-default
--no-help NO_HELP
Namespace(a=13, b=42, no_default=None, no_help=101)
usage: a.py [-h] [-a A] [-b B]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a (default: 13)
-b B my help
for b (default: 42)
ArgumentDefaultsHelpFormatter
+RawTextHelpFormatter
多重继承
多重继承只起作用,但它似乎不是公共API:
#!/usr/bin/env python3
import argparse
class RawTextArgumentDefaultsHelpFormatter(
argparse.ArgumentDefaultsHelpFormatter,
argparse.RawTextHelpFormatter
):
pass
parser = argparse.ArgumentParser(
formatter_class=RawTextArgumentDefaultsHelpFormatter
)
parser.add_argument('-a', default=13, help='''my help
for a''')
parser.add_argument('-b', default=42, help='''my help
for b''')
parser.print_help()
输出:
usage: main.py [-h] [-a A] [-b B] [--no-default NO_DEFAULT]
[--no-help NO_HELP]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a Default: 13
-b B my help
for b Default: 42
--no-default NO_DEFAULT
my help
for no-default
--no-help NO_HELP
Namespace(a=13, b=42, no_default=None, no_help=101)
usage: a.py [-h] [-a A] [-b B]
optional arguments:
-h, --help show this help message and exit
-a A my help
for a (default: 13)
-b B my help
for b (default: 42)
它之所以有效,是因为我们可以从以下来源中看到:
RawTextHelpFormatter
实现\u拆分\u行
ArgumentDefaultsHelpFormatter
实现\u获取\u帮助\u字符串
所以我们可以猜测他们会很好地合作
但是,这似乎不是公共API,格式化程序类的方法也不是,因此我认为目前没有公共API方法来实现这一点argparse
docstring表示:
此模块中的所有其他类都被视为实现细节。
(还要注意,HelpFormatter和RawDescriptionHelpFormatter只是
作为对象名被认为是公共的——格式化程序对象的API是
仍在考虑实施细节。)
另见:
在Python 3.6.5上测试。能够在帮助输出中自动包含default
值通常很有用,但只包含那些明确指定的值(使用default=..
)。上述方法在这方面有一些缺点:
ArgumentDefaultsHelpFormatter
为未明确指定默认值的每个参数打印(默认值:无)
,为“标志”(action='store\u true'
)打印。这会使帮助输出变得混乱。为了避免这种情况,需要为每个这样的参数手动添加default=argparse.SUPPRESS
'%(默认)s'
需要手动将其添加到所有参数“帮助”
字符串中,我们确实希望在帮助中打印这些字符串
这两种方法最终都需要手动干预,只打印“正确”的默认值。
自动执行此操作的一种方法是增加参数defaultshelpformatter
以忽略None
s和False
s默认值:
类显式DefaultShelpFormatter(argparse.ArgumentDefaultsHelpFormatter):
def_get_help_字符串(self,action):
如果action.default为(无,False):
returnaction.help
返回super()。\u获取\u帮助\u字符串(操作)
使用它代替ArgumentDefaultsHelpFormatter
:
parser=argparse.ArgumentParser(
formatter_class=ExplicitDefaultsHelpFormatter
)
这将仅打印帮助输出中显式设置的默认值
注意:如果参数的默认值被显式设置为None
或False
,则该类的帮助中不会显示该参数;如果希望在帮助输出中添加该参数的%(默认)s
字符串到help
。您可能感兴趣。我再也没有看过argparse了。@PauloScardine-内置到语言中是argparse的一个主要好处。@PauloScardine:将一个非标准库拉到我当前的项目中确实是一件痛苦的事情,但我确实喜欢docopt输出的外观。谢谢你的提示@JS。你说“把一个非标准的库放到我当前的项目中确实会很痛苦”真的吗?pypi有很多非常有用的库。在我的上下文中,很容易引入非标准库。“如果在你的环境中这很难,那真是太悲哀了。”@guettli:那个项目是为一个商业嵌入式项目设计的。你说得对,安装很简单。得到