Python argparse AssertionError при использовании взаимоисключающей группы - PullRequest
4 голосов
/ 06 марта 2020

Вот мой простой скрипт test.py:

import argparse

parser = argparse.ArgumentParser('A long string that goes on and on and on'
                                 'and on and on and on and on and on and on '
                                 'and on and on and on and on and on and on '
                                 'and on and on and on and on and on and on ')
me_group = parser.add_mutually_exclusive_group()
me_group.add_argument('-f', help=argparse.SUPPRESS)
me_group.add_argument('-o', help=argparse.SUPPRESS)
parser.add_argument('-t', help='c')
parser.parse_args()

Когда я запускаю следующее:

python test.py --help

Я получаю эту ошибку AssertionError:

...
  File "/usr/lib/python2.7/argparse.py", line 332, in _format_usage
    assert ' '.join(opt_parts) == opt_usage
AssertionError

This Кажется, это происходит только тогда, когда я подавляю все аргументы во взаимоисключающей группе. Если один или несколько не подавлен, то все работает нормально. Если я распечатываю две стороны сравнения:

print ' '.join(opt_parts)
print opt_usage

, я получаю следующее:

[-h] [-t T]
[-h]  [-t T]

Похоже, там есть дополнительное пространство. Есть идеи, почему это будет? Что-то я делаю неправильно?

1 Ответ

1 голос
/ 06 марта 2020

Это известная проблема при подавлении аргументов. Это достигается только тогда, когда строка использования достаточно длинная, чтобы ее нужно было обернуть. См. 22363 и 17890

Этого можно избежать, переместив взаимоисключающую группу в конец аргументов:

import argparse

parser = argparse.ArgumentParser('A long string that goes on and on and on'
                                 'and on and on and on and on and on and on '
                                 'and on and on and on and on and on and on '
                                 'and on and on and on and on and on and on ')
parser.add_argument('-t', help='c')
me_group = parser.add_mutually_exclusive_group()
me_group.add_argument('-f', help=argparse.SUPPRESS)
me_group.add_argument('-o', help=argparse.SUPPRESS)
parser.parse_args()

приводит к :

python test.py -h
usage: A long string that goes on and on and onand on and on and on and on and on and on and on and on and on and on and on and on and on and on and on and on and on and on
       [-h] [-t T]

optional arguments:
  -h, --help  show this help message and exit
  -t T        c
...