当 nargs='+' 时,如何避免帮助消息的方括号 [...]?

How do I avoid bracketed [...] of help message when nargs='+'?

我正在尝试使用 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 转义码实施修复的方法,尽管是一种变通方法:

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 元组元组的想法。

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

--score FILENAME
--score FILENAME X Y

您应该考虑以下替代方案之一:

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

使用标准命令行参数解析库可以轻松支持这两者。

没有 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 由 longname 导出,'%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)
    ...