Я довольно часто пишу программы командной строки, которые полагаются на обработку, уже определенную в другой, с некоторыми изменениями поведения.
Когда для этого требуется добавить аргумент, я могу сделать что-то вроде:
@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.