Search code examples
pythondjangoargparse

Is it possible to pass command line arguments to a decorator in Django?


I have a decorator that is supposed to use a parameter that's passed in from the commandline e.g

@deco(name)
def handle(self, *_args, **options):
    name = options["name"]
def deco(name):
    // The name should come from commandline
    pass
class Command(BaseCommand):
    def add_arguments(self, parser):
        parser.add_argument(
            "--name",
            type=str,
            required=True,
        )
    @deco(//How can I pass the name here?)
    def handle(self, *_args, **options):
        name = options["name"]

any suggestions on this?


Solution

  • You can make a "meta-decorator", something like:

    from functool import wraps
    
    def metadeco(function):
        @wraps(function)
        def func(*args, **kwargs):
            name = kwargs['name']
            return deco(name)(function)(*args, **kwargs)
        return func
    

    and then work with that meta-decorator:

    class Command(BaseCommand):
        def add_arguments(self, parser):
            parser.add_argument(
                "--name",
                type=str,
                required=True,
            )
        
        @metadeco
        def handle(self, *_args, **options):
            name = options['name']
            # …