Пользовательские действия Python argparse с переданными дополнительными аргументами

import argparse class customAction(argparse.Action): def __call__(self, parser, args, values, option_string=None): setattr(args, self.dest, values) parser = argparse.ArgumentParser() parser.add_argument('-e', '--example', action=customAction) 

Я хочу передать дополнительные аргументы в customAction, когда запускается опция -e, например экземпляр другого класса. Как я могу это сделать? Все, что я пробовал, вышло из строя.

2 Solutions collect form web for “Пользовательские действия Python argparse с переданными дополнительными аргументами”

 def make_action(additional_arg): class customAction(argparse.Action): def __call__(self, parser, args, values, option_string=None): print(additional_arg) setattr(args, self.dest, values) return customAction #... parser.add_argument('-e', '--example', action=make_action('your arg')) 

Другим решением является argparse.Action основанного на классе класса argparse.Action следующим образом:

 class CustomAction(argparse.Action): def __init__(self,option_strings, additional_arg1,additional_arg2, dest=None, nargs=0, default=None, required=False, type=None, metavar=None, help=None): self._a1=additional_arg1 self._a2=additional_arg2 super(CustomAction, self).__init__( option_strings=option_strings, dest=dest, nargs=nargs, default=default, required=required, metavar=metavar, type=type, help=help) def __call__(self, parser, namespace, values, option_string=None): print(self._a1) print(self._a2) setattr(args, self.dest, values) #........ parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) по class CustomAction(argparse.Action): def __init__(self,option_strings, additional_arg1,additional_arg2, dest=None, nargs=0, default=None, required=False, type=None, metavar=None, help=None): self._a1=additional_arg1 self._a2=additional_arg2 super(CustomAction, self).__init__( option_strings=option_strings, dest=dest, nargs=nargs, default=default, required=required, metavar=metavar, type=type, help=help) def __call__(self, parser, namespace, values, option_string=None): print(self._a1) print(self._a2) setattr(args, self.dest, values) #........ parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) по class CustomAction(argparse.Action): def __init__(self,option_strings, additional_arg1,additional_arg2, dest=None, nargs=0, default=None, required=False, type=None, metavar=None, help=None): self._a1=additional_arg1 self._a2=additional_arg2 super(CustomAction, self).__init__( option_strings=option_strings, dest=dest, nargs=nargs, default=default, required=required, metavar=metavar, type=type, help=help) def __call__(self, parser, namespace, values, option_string=None): print(self._a1) print(self._a2) setattr(args, self.dest, values) #........ parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) по class CustomAction(argparse.Action): def __init__(self,option_strings, additional_arg1,additional_arg2, dest=None, nargs=0, default=None, required=False, type=None, metavar=None, help=None): self._a1=additional_arg1 self._a2=additional_arg2 super(CustomAction, self).__init__( option_strings=option_strings, dest=dest, nargs=nargs, default=default, required=required, metavar=metavar, type=type, help=help) def __call__(self, parser, namespace, values, option_string=None): print(self._a1) print(self._a2) setattr(args, self.dest, values) #........ parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) 

В качестве альтернативы, поставьте *args и **kwargs чтобы передать любые дополнительные параметры родительскому конструктору.

 class CustomAction(argparse.Action): def __init__(self, option_strings, additional_arg1, additional_arg2, *args, **kwargs): self._a1 = additional_arg1 self._a2 = additional_arg2 super(CustomAction, self).__init__(option_strings=option_strings, *args, **kwargs) def __call__(self, parser, namespace, values, option_string=None): print(self._a1) print(self._a2) setattr(args, self.dest, values) #........ parser.add_argument('-e', '--example', action=CustomAction, additional_arg1='your arg', additional_arg2=42) 
  • Python 2.7 argparse: Как правильно вставить необязательные мутабельные аргументы?
  • Python argparse: Взаимно эксклюзивная группа с требуемым параметром
  • Изменение значения metavar в argparse только в списке аргументов, а не в его использовании
  • параметр argparse для передачи списка в качестве опции
  • Подклассификация аргумента Аргумент Parser
  • Аргумент argparse сгенерировал справку, «metavar» с выбором
  • TypeError: принуждение к Unicode: нужна строка или буфер, список найден
  • Необязательный stdin в Python с argparse
  • Python - лучший язык программирования в мире.