изменение существующего синтаксического анализатора argparse - в частности, удаление позиционного - PullRequest
0 голосов
/ 17 мая 2018

Я довольно часто пишу программы командной строки, которые полагаются на обработку, уже определенную в другой, с некоторыми изменениями поведения.

Когда для этого требуется добавить аргумент, я могу сделать что-то вроде:

@classmethod
def modify_parser(cls, parser):
    dest="node"
    default="root"
    parser.add_argument(
        "--" + dest,
        action="store",
        help="%s node to list[%s]" % (dest,default)
        )

Я не пишу подкоманду, я просто добавляю опцию к существующему парсеру.Работает нормально.

ОК, но допустим, я хочу удалить опцию.Давайте рассмотрим приведенное ниже вспомогательное сообщение argparse:

usage: test_dumper3.py [-h] 
                       [--Database DBNAME]
                       config [recname [recname ...]]

dump out tables

positional arguments:
  config                config file   <<<< I DONT WANT THIS!
  recname                             <<<< because this replaces it
....

Это моя первая попытка:

@classmethod
def modify_parser(cls, parser):

    dest="recname"
    parser.add_argument(
        dest,
        nargs="*",
        action="store",
        help=dest
        )
    parser._positionals._remove_action("config")

И я получу ValueError('list.remove(x): x not in list',).

Я предполагаю, что вынужно передать экземпляр argparse.Action для удаления, а не его имя.Где-нибудь, где я могу это посмотреть?Что-то вроде action_to_delete = parser.get_action('config'), а затем parser._positionals._remove_action(action_to_delete)?

Я не против риска связанного с _ закрытыми атрибутами, просто немного поэкспериментирую с argparse.

...