Yur*_*sov 3 python argparse python-3.x
我将Python3 argparse用于复杂的命令行界面。为了避免误解,有很多论点,其中一些是“冗长的”。
parser = argparse.ArgumentParser(description='Command-line interface')
parser.add_argument('--long-param-one',
help='Long param one description',
dest='lond_param_one',
required=True)
parser.add_argument('--long-param-two',
help='Long param two description',
dest='lond_param_two',
required=True)
Run Code Online (Sandbox Code Playgroud)
当参数名称足够长而目标变量也足够长时,当您使用以下命令调用脚本时,它将导致格式难看 --help
Command-line interface
optional arguments:
-h, --help show this help message and exit
--long-param-one LONG_PARAM_ONE
Long param one description
--long-param-two LONG_PARAM_TWO
Long param two description
Run Code Online (Sandbox Code Playgroud)
我的意思是,参数和值在一个字符串上,描述在另一个字符串上,即使控制台右侧有足够的空间将其放在一行中。就像第一个参数--help一样。当您有30-40个参数时,命令行帮助的可读性确实变差了
argparse 默认情况下会限制option + metavar占用的最大空间,并且即使终端足够大以容纳两个选项,也会将帮助消息写在单独的行上。
考虑以下示例脚本:
import argparse
parser = argparse.ArgumentParser()
parser.add_argument('--name', help='help help')
parser.add_argument('--parameter', help='help help')
parser.add_argument('--parameter-name', help='help help')
parser.add_argument('--this-parameter-name', help='help help')
parser.add_argument('--this-is-parameter-name', help='help help')
parser.add_argument('--this-is-a-parameter-name', help='help help')
parser.add_argument('--this-is-a-long-parameter-name', help='help help')
parser.add_argument('--this-is-a-very-long-parameter-name', help='help help')
parser.add_argument('--this-is-a-very-very-long-parameter-name', help='help help')
parser.add_argument('--this-is-a-very-very-very-long-parameter-name', help='help help')
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
结果如下:
usage: a.py [-h] [--name NAME] [--parameter PARAMETER]
[--parameter-name PARAMETER_NAME]
[--this-parameter-name THIS_PARAMETER_NAME]
[--this-is-parameter-name THIS_IS_PARAMETER_NAME]
[--this-is-a-parameter-name THIS_IS_A_PARAMETER_NAME]
[--this-is-a-long-parameter-name THIS_IS_A_LONG_PARAMETER_NAME]
[--this-is-a-very-long-parameter-name THIS_IS_A_VERY_LONG_PARAMETER_NAME]
[--this-is-a-very-very-long-parameter-name THIS_IS_A_VERY_VERY_LONG_PARAMETER_NAME]
[--this-is-a-very-very-very-long-parameter-name THIS_IS_A_VERY_VERY_VERY_LONG_PARAMETER_NAME]
optional arguments:
-h, --help show this help message and exit
--name NAME help help
--parameter PARAMETER
help help
--parameter-name PARAMETER_NAME
help help
--this-parameter-name THIS_PARAMETER_NAME
help help
--this-is-parameter-name THIS_IS_PARAMETER_NAME
help help
--this-is-a-parameter-name THIS_IS_A_PARAMETER_NAME
help help
--this-is-a-long-parameter-name THIS_IS_A_LONG_PARAMETER_NAME
help help
--this-is-a-very-long-parameter-name THIS_IS_A_VERY_LONG_PARAMETER_NAME
help help
--this-is-a-very-very-long-parameter-name THIS_IS_A_VERY_VERY_LONG_PARAMETER_NAME
help help
--this-is-a-very-very-very-long-parameter-name THIS_IS_A_VERY_VERY_VERY_LONG_PARAMETER_NAME
help help
Run Code Online (Sandbox Code Playgroud)
尝试避免此问题的最简单方法是metavar显式指定并使用短值,因此ov THIS_IS_A_VERY_VERY_VERY_LONG_PARAMETER_NAME可以代替使用X。例如:
import argparse
parser = argparse.ArgumentParser()
m = 'X'
parser.add_argument('--name', help='help help', metavar=m)
parser.add_argument('--parameter', help='help help', metavar=m)
parser.add_argument('--parameter-name', help='help help', metavar=m)
parser.add_argument('--this-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-very-long-parameter-name', help='help help', metavar=m)
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
结果是:
usage: a.py [-h] [--name X] [--parameter X] [--parameter-name X]
[--this-parameter-name X] [--this-is-parameter-name X]
[--this-is-a-parameter-name X] [--this-is-a-long-parameter-name X]
[--this-is-a-very-long-parameter-name X]
[--this-is-a-very-very-long-parameter-name X]
[--this-is-a-very-very-very-long-parameter-name X]
optional arguments:
-h, --help show this help message and exit
--name X help help
--parameter X help help
--parameter-name X help help
--this-parameter-name X
help help
--this-is-parameter-name X
help help
--this-is-a-parameter-name X
help help
--this-is-a-long-parameter-name X
help help
--this-is-a-very-long-parameter-name X
help help
--this-is-a-very-very-long-parameter-name X
help help
--this-is-a-very-very-very-long-parameter-name X
help help
Run Code Online (Sandbox Code Playgroud)
这已经好多了,但是如您所见,参数名称很长,它仍然不会在一行上写所有文本。
达到你想要的东西的唯一方法是指定formatter_class和使用max_help_position中的说明了这个问题。但是,这不是该模块的公共API的一部分。我不知道他们何时没有向公共API中添加至少两个有用的参数。
您仍然可能要指定一个metavar:
import argparse
formatter = lambda prog: argparse.HelpFormatter(prog,max_help_position=52)
parser = argparse.ArgumentParser(formatter_class=formatter)
m = 'X'
parser.add_argument('--name', help='help help', metavar=m)
parser.add_argument('--parameter', help='help help', metavar=m)
parser.add_argument('--parameter-name', help='help help', metavar=m)
parser.add_argument('--this-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-long-parameter-name', help='help help', metavar=m)
parser.add_argument('--this-is-a-very-very-very-long-parameter-name', help='help help', metavar=m)
parser.parse_args()
Run Code Online (Sandbox Code Playgroud)
输出将是:
usage: a.py [-h] [--name X] [--parameter X] [--parameter-name X]
[--this-parameter-name X] [--this-is-parameter-name X]
[--this-is-a-parameter-name X] [--this-is-a-long-parameter-name X]
[--this-is-a-very-long-parameter-name X]
[--this-is-a-very-very-long-parameter-name X]
[--this-is-a-very-very-very-long-parameter-name X]
optional arguments:
-h, --help show this help message and
exit
--name X help help
--parameter X help help
--parameter-name X help help
--this-parameter-name X help help
--this-is-parameter-name X help help
--this-is-a-parameter-name X help help
--this-is-a-long-parameter-name X help help
--this-is-a-very-long-parameter-name X help help
--this-is-a-very-very-long-parameter-name X help help
--this-is-a-very-very-very-long-parameter-name X help help
Run Code Online (Sandbox Code Playgroud)
您可能会尝试确定终端的大小(大多数终端提供可能对此有用的a WIDTH或COLUMNSenv变量),以决定该值max_help_position在那种情况下最好。
要使所有参数都在一行上(假设端子足够大)提供帮助,您需要:
max_help_position >= max(len(param.name)+len(param.metavar) for param in params)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
893 次 |
| 最近记录: |