Acciones personalizadas de Python argparse con argumentos adicionales pasados

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) 

Quiero pasar argumentos adicionales a customAction cuando se activa la opción -e, por ejemplo, una instancia de otra clase. ¿Cómo puedo hacer esto? Todo lo que he intentado ha fallado.

 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')) 

Otra solución es derivar la clase basada argparse.Action esta manera:

 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) 

Alternativamente, suministre *args y **kwargs para pasar cualquier parámetro adicional al constructor principal.

 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)