argparse
默认情况下,限制选项+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()
结果输出如下:
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
最简单的方法
尝试
要避免此问题,请指定
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()
结果是:
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
这已经好了很多,但是正如您可以看到的,参数名很长,它仍然不会将所有文本写在一行上。
实现所需目标的唯一方法是指定
formatter_class
并使用
max_help_position
如中所述
this question
. 但是,这不是模块的公共API的一部分。我不知道他们什么时候没有向公共API添加至少两个有用的参数。
您可能仍要指定
元变量
:
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()
输出将是:
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
您可能会尝试确定终端的大小(大多数终端都提供
WIDTH
或
COLUMNS
env变量,可用于确定
最大帮助位置
在那种情况下那是最好的。
要使所有参数在一行上都有帮助(假设足够大的终端),您需要:
max_help_position >= max(len(param.name)+len(param.metavar) for param in params)