Python Параметр argparse subparser dest не работает с родителем - PullRequest
2 голосов
/ 27 февраля 2020

Я пишу утилиту, которая будет иметь несколько модулей, и какой модуль запускается, определяется аргументом. Каждый модуль имеет свои собственные аргументы, но все модули будут иметь 4 стандартных аргумента. Чтобы заставить это работать, я просто установил параметр 'parent' при создании подпарсеров, но проблема в том, что мне также нужно иметь возможность определить, какой модуль вызывался из командной строки. Похоже, что параметр «dest» - это способ сделать это, но по какой-то причине одновременное задание одновременно «parent» и «dest» не работает.

import argparse

parser = argparse.ArgumentParser() # main parser
parser.addArgument("--foo", action='store_true')

subparsers = parser.add_subparsers(dest='cmd')
# without 'parents=[parser]' it properly stores 'bar' in cmd
# however '--foo' MUST be before 'bar'
bar = subparsers.add_parser("bar", parents=[parser], add_help=False)
bar.add_argument("--test", action='store_true')

# should be able to have '--foo' before OR after 'bar'
parser.parse_args(['--foo', 'bar', '--test'])

В этом коде вызов add_subparsers устанавливает dest в 'cmd.' Затем я мог бы проанализировать аргументы и вызвать args.cmd, чтобы получить имя вызываемого модуля (в данном случае, bar). Однако, когда установлено parents, значение cmd всегда равно None. В настоящее время мой обходной путь состоит в том, чтобы просто иметь пустой основной синтаксический анализатор и просто скопировать и вставить 4 стандартных аргумента в каждый подпарсер, что работает, но не совсем желательно.

Мой вопрос: есть ли другой способ определить, какой модуль был называется? Почему это вообще происходит?

...