Есть ли способ установить варианты без какого-либо префикса в аргпаресе?

StackOverflow https://stackoverflow.com/questions/4370834

  •  09-10-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top