Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python argparse custom actions with additional arguments passed

People also ask

How do you add an optional argument in Argparse?

To add an optional argument, simply omit the required parameter in add_argument() . args = parser. parse_args()if args.

What is Argparse ArgumentParser ()?

The argparse module provides a convenient interface to handle command-line arguments. It displays the generic usage of the program, help, and errors. The parse_args() function of the ArgumentParser class parses arguments and adds value as an attribute dest of the object.

What is Store_true in Python?

The store_true option automatically creates a default value of False. Likewise, store_false will default to True when the command-line argument is not present.


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

Another solution is to derive the based class argparse.Action like this:

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)

Alternatively, supply *args and **kwargs to pass through any additional parameters to the parent constructor.

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)