当nargs ='+'时,如何避免括号内的帮助信息?

时间:2017-01-26 02:53:41

标签: python python-3.x argparse

我正在尝试使用Python中的argparse模块编写命令行界面,但是我的一个参数的帮助消息遇到了麻烦。参数应该采用1个参数(文件名)或3个参数(文件名,列,列),所以这就是我接近它的方式:

parser = argparse.ArgumentParser()
parser.add_argument('--score', nargs ='+', help='score file, default X Y = 2 4',
     metavar='FILENAME X Y')
args = parser.parse_args()

然后是if-else:

if len(args.score) == 1:
     data = open(args.score[0])
     S1 = 1
     S2 = 3
elif len(args.score) == 3:
     data = open(args.score[0])
     S1 = int(args.score[1]) - 1
     S2 = int(args.score[2]) - 1
else:
     print('Error: --score incorrect number of arguments called')

但我的帮助信息如下:

  -h, --help            show this help message and exit
  --score FILENAME X Y [FILENAME X Y ...]
                        score file, default X Y = 2 4

我希望括号中的部分消失:

  -h, --help            show this help message and exit
  --score FILENAME X Y  score file, default X Y = 2 4  

修改
以下是我选择使用ANSI转义码来实现修复的方法,尽管这是一个hacky变通方法:

parser.add_argument('--score', nargs ='+', help='\x1b[A\b\b\b\b\b\b X Y \x1b[1C\b score file, default X Y = 2 4',
    metavar=('FILENAME', ''))

给出输出

usage: test.py [-h] [--score FILENAME [...]]

optional arguments:
  -h, --help            show this help message and exit
  --score FILENAME X Y  score file, default X Y = 2 4

感谢@hpaulj的metavar元组想法。

2 个答案:

答案 0 :(得分:0)

在命令行界面的世界里,你所做的是非常不标准的。你应该重新设计你的参数语法。而不是支持这两个:

--score FILENAME
--score FILENAME X Y

您应该考虑其中一种选择:

--score FILENAME [-x X] [-y Y]
--score FILENAME[=X,Y]

使用标准命令行参数解析库很容易支持这两种方法。

答案 1 :(得分:0)

没有metavar帮助就是:

usage: ipython3 [-h] [--score SCORE [SCORE ...]]

optional arguments:
  -h, --help            show this help message and exit
  --score SCORE [SCORE ...]
                        score file, default X Y = 2 4

SCORE源自长名称和'%s [%s ...]' % get_metavar(2)格式。

如果我将metavar更改为2个元组的元组,它们会替换SCORE

这两个实例
usage: ipython3 [-h] [--score NAME [XY ...]]

optional arguments:
  -h, --help            show this help message and exit
  --score NAME [XY ...]
                        score file, default X Y = 2 4

使用nargs = 3,我可以在metavar中给出这些单词并获得:

usage: ipython3 [-h] [--score NAME X Y]
....

将该输入拆分为2个参数给出

In [774]: parser.add_argument('--FILENAME', help='score file', metavar='NAME');
In [775]: parser.add_argument('--XY', nargs=2, help='x,y');  # type=int
In [776]: parser.print_help()

usage: ipython3 [-h] [--FILENAME NAME] [--XY XY XY]

optional arguments:
  -h, --help       show this help message and exit
  --FILENAME NAME  score file
  --XY XY XY       x,y

=================

实际格式由HelpFormatter._format_args方法生成:

def _format_args(self, action, default_metavar):
    get_metavar = self._metavar_formatter(action, default_metavar)
    ....
    elif action.nargs == ONE_OR_MORE:
        result = '%s [%s ...]' % get_metavar(2)
    ...