Python单击"库重命名参数"

Jam*_*Lam 5 python python-click

我使用的Click库,但我似乎无法找到类似行为destargparse.

例如,我有

@click.option('--format', type=click.Choice(['t', 'j']))
def plug(format):
  pass
Run Code Online (Sandbox Code Playgroud)

请注意,我使用的标志--format被转换为内置的Python构造format,这是不理想的.

有没有办法更改传递给选项的click函数的参数?

Lav*_*Lav 9

虽然Click没有 - dest等价argparse,但它具有某些可以被利用的参数命名行为.具体而言,对于具有多个可能名称的参数,它将优选非虚线到虚线名称,并且作为次要首选项将优先考虑较长名称而不是较短名称.

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

所以,如果你宣布你的选择为......

@click.option('--format', 'not-format', type=click.Choice(['t', 'j']))
Run Code Online (Sandbox Code Playgroud)

...然后单击将优先处理非虚线变量('not-format')并使用not_format=...参数调用您的函数.

当然,这也意味着这种替代拼写也可以在命令行中使用.如果不需要,那么我想你可以添加一个装饰器来重命名关键字参数:

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
Run Code Online (Sandbox Code Playgroud)

测试代码:

if __name__ == '__main__':

    @rename_kwargs(different_arg='format')
    def tester(different_arg):
        print different_arg

    tester(format='test value')
Run Code Online (Sandbox Code Playgroud)

测试输出:

$ python test_decor.py
test value
Run Code Online (Sandbox Code Playgroud)

在您的情况下,它看起来像:

@click.option('--format', type=click.Choice(['t', 'j']))
@replace_kwargs(not_format='format')
def plug(not_format):
    pass
Run Code Online (Sandbox Code Playgroud)


Lar*_*erg 6

如果您用

@click.option('--format', '-f', 'format_arg_name')
def plug(format_arg_name):
    print(format_arg_name)
Run Code Online (Sandbox Code Playgroud)

然后它将选项映射到format_arg_name参数。

format_arg_name 在命令行上将不可用。