Есть ли способ установить варианты без какого-либо префикса в аргпаресе?
Вопрос
Я использую ArgParser, чтобы обрабатывать аргументы для моей PROG. Но как прошло время, я думаю, что это не очень хорошая идея, чтобы его использовать. Вот приходит проблема. Я хочу использовать варианты без какого-либо префикса. Нравиться Гит Commit. или SVN двигаться.. Отказ Я искал немного и обнаружил, что есть метод add_subparser (). Давайте заполним наш фюра PROG:
parser = argparse.ArgumentParser(prog='foo', usage='%(prog)s [options]')
subparsers = parser.add_subparsers(help='sub-command help')
parser_a = subparsers.add_parser('add', help='a help')
parser_a.add_argument('-ap', '--add-project',
nargs='*',
action='store',
help="Add project")
parser_d = subparsers.add_parser('del', help='a help')
parser_d.add_argument('-dp', '--delete-project',
nargs='*',
action='store',
help="Delete project")
args = parser.parser_args()
Теперь дайте выполнить FOO с вариантами и печатью args
пространство имен (я не прошел весь код, вы получаете точку):
$ ./foo del
Namespace(delete_project=None)
$ ./foo add
Namespace(add_project=None)
Как вы видите, если я выполню вариант del
, add_project. не передается на переменную args
. Отказ Что вызывает проблемы, если у меня есть «пункт« если »в моей главной () функции, как
def main(args):
if args.delete_project:
...
if args.add_project:
...
Я получу AttributeError. Исключение, что пространство имен не имеет атрибута с именем add_project. Если я выполню ./foo del
. Отказ Кроме того, я не могу пройти любой аргумент к вариантам del
и add
. Отказ Я также установил Prefix_Chars в пустую строку, которая тоже не работала.
Что такое способ справиться с этим? Является ли argparse, способным создать параметры, такие как GIT, SVN, и т. Д. Или я должен создать свою собственную функцию и справиться с всеми аргументами?
Решение
Вместо ваших заявлений, Документы Argparse рекомендуют что-то вроде этого:
parser_X.set_defaults(action=action_func)
args.action(args)
Затем Add_action будет смотреть на ADD_PROJECT и DEL_ACTY на DEL_PROJECT.
Другие советы
Редактировать: видимо по умолчанию для default
является None
, что означает, что у нас нет одного, так что вам придется использовать True
и False
(что в любом случае является правильным способом).
Вам нужно добавить default
Когда вы добавляете свой аргумент на парсер:
parser_a.add_argument('-ap', '--add-project',
nargs = '*',
action = 'store_true',
default = False,
help = "Add project")
Вы можете увидеть документацию для add_argument
метод здесь. Отказ (Я понимаю, что argparse
Док Макет не самая способствует выяснению того, как делать вещи, которые не вызываются в примерах)
Кроме того, поскольку TOBU соответствующим образом указывает в его ответ, неиспользуемые подделки не вызывают, поэтому вы не можете безопасно исследовать их значения, не по крайней мере, защитите свой код в try:
блокировать. Тем не менее, на самом деле вы должны использовать функциональность ассоциирования action
с вашими подделками, если у вас нет гораздо сложной ситуации, где им нужно делиться государством.