Сегодня днем я получил ту же ошибку и нашел ваш вопрос, когда искал какое-то решение.
Если вы прочитали __init__()
аргумента ArgumentParser, вы можете увидеть, что он принимает ряд аргументов, включая правильные'prog':
class ArgumentParser(_AttributeHolder, _ActionsContainer):
"""SOME DOC STRING..."""
def __init__(self,
prog=None,
usage=None,
description=None,
epilog=None,
parents=[],
formatter_class=HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True,
allow_abbrev=True):
...... # SOME IMPLEMENTATION
Я думаю, что факт: пользовательский класс синтаксического анализатора переопределяет метод __init__()
и не принимает аргументов.Но другие методы не изменены.Это привело к конфликту поведения методов.При создании подпарсера add_parser () вызывает синтаксический анализатор __init__()
с аргументами, включая «prog».Для ArgumentParser это нормально, но для пользовательского синтаксического анализатора с переопределенной __init__()
очевидно, что он потерпит неудачу.
Конечно, предложение @ jcollado работает нормально, но, похоже, оно также отменяет настройку поведения субпарсера.
Мое решение этой проблемы немного уродливо, но также хорошо работает.При переопределении __init__()
ArgumentParser просто сохраните каждый аргумент и его значение по умолчанию.Как это:
class MyParser(argparse.ArgumentParser):
def __init__(
self,
prog=None,
usage=None,
description=None,
epilog=None,
parents=[],
formatter_class=argparse.HelpFormatter,
prefix_chars='-',
fromfile_prefix_chars=None,
argument_default=None,
conflict_handler='error',
add_help=True,
allow_abbrev=True
# and your custom arguments here
):
super(MyParser, self).__init__(prog=prog, usage=usage, description=description, epilog=epilog,
parents=parents, formatter_class=formatter_class,
prefix_chars=prefix_chars, fromfile_prefix_chars=fromfile_prefix_chars,
argument_default=argument_default, conflict_handler=conflict_handler,
add_help=add_help, allow_abbrev=allow_abbrev
)
# and your custom actions here