Python Click Library Rename Argument

后端 未结 2 1790
既然无缘
既然无缘 2021-01-18 15:07

I am using the Click library but I can\'t seem to find a behavior similar to dest from argparse.

For example, I have

相关标签:
2条回答
  • 2021-01-18 15:26

    Renaming an option to a differently named function argument is possible by decorating the function with

    @click.option('--format', '-f', 'format_arg_name')
    def plug(format_arg_name):
        print(format_arg_name)
    

    then it will remap the option named format and make it available as the format_arg_name parameter.

    format_arg_name will not be available as a command line option, but --format and -f are.

    0 讨论(0)
  • 2021-01-18 15:28

    While Click doesn't have dest-equivalent of argparse, it has certain argument-naming behavior which can be exploited. Specifically, for parameters with multiple possible names, it will prefer non-dashed to dashed names, and as secondary preference will prioritize longer names over shorter names.

    URL: http://click.pocoo.org/dev/parameters/#parameter-names

    So if you declare your option as...

    @click.option('--format', 'not-format', type=click.Choice(['t', 'j']))
    

    ...then Click will prioritize non-dashed variant ('not-format') and call your function with not_format=... argument.

    Of course it also means that this alternative spelling can also be used in command line. If that is not desired, then I guess you could add a decorator to rename keyword arguments:

    import functools
    
    def rename_kwargs(**replacements):
        def actual_decorator(func):
            @functools.wraps(func)
            def decorated_func(*args, **kwargs):
                for internal_arg, external_arg in replacements.iteritems():
                    if external_arg in kwargs:
                        kwargs[internal_arg] = kwargs.pop(external_arg)
                return func(*args, **kwargs)
            return decorated_func
        return actual_decorator
    

    Testing code:

    if __name__ == '__main__':
    
        @rename_kwargs(different_arg='format')
        def tester(different_arg):
            print different_arg
    
        tester(format='test value')
    

    Test output:

    $ python test_decor.py
    test value
    

    In your case, it would look like:

    @click.option('--format', type=click.Choice(['t', 'j']))
    @replace_kwargs(not_format='format')
    def plug(not_format):
        pass
    
    0 讨论(0)
提交回复
热议问题