Python 在单击命令的顶部进行装饰

Python 在单击命令的顶部进行装饰,python,python-3.x,command-line-arguments,python-decorators,python-click,Python,Python 3.x,Command Line Arguments,Python Decorators,Python Click,我正在尝试修饰一个函数,该函数已被@单击修饰并从命令行调用 将输入资本化的正常装饰可能如下所示: def sample_decorator(f): def run(*args, **kwargs): return f(*args, param="yea", **kwargs) return run 标准装饰.py def capitalise_input(f): def wrapper(*args): args = (

我正在尝试修饰一个函数,该函数已被
@单击修饰并从命令行调用

将输入资本化的正常装饰可能如下所示:

def sample_decorator(f):
    def run(*args, **kwargs):
        return f(*args, param="yea", **kwargs)
    return run
标准装饰.py

def capitalise_input(f):
    def wrapper(*args):
        args = (args[0].upper(),)
        f(*args)
    return wrapper

@capitalise_input
def print_something(name):
    print(name)

if __name__ == '__main__':
    print_something("Hello")
import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
然后从命令行:

$ python standard_decoration.py
HELLO
$ python hello.py --count=3
Your name: John
Hello John!
Hello John!
Hello John!
中的第一个示例如下所示:

def sample_decorator(f):
    def run(*args, **kwargs):
        return f(*args, param="yea", **kwargs)
    return run
你好.py

def capitalise_input(f):
    def wrapper(*args):
        args = (args[0].upper(),)
        f(*args)
    return wrapper

@capitalise_input
def print_something(name):
    print(name)

if __name__ == '__main__':
    print_something("Hello")
import click

@click.command()
@click.option('--count', default=1, help='Number of greetings.')
@click.option('--name', prompt='Your name',
              help='The person to greet.')
def hello(count, name):
    """Simple program that greets NAME for a total of COUNT times."""
    for x in range(count):
        click.echo('Hello %s!' % name)

if __name__ == '__main__':
    hello()
从命令行运行时:

$ python standard_decoration.py
HELLO
$ python hello.py --count=3
Your name: John
Hello John!
Hello John!
Hello John!
  • 应用修饰符修改这个点击修饰函数的输入的正确方法是什么,例如使其大写,就像上面的一样

  • 一旦一个函数通过点击来修饰,它所拥有的任何位置参数都会转换为关键字参数,这是真的吗?它似乎将
    '--count'
    之类的内容与参数函数中的字符串相匹配,然后装饰函数中的顺序似乎不再重要


  • 似乎click传递了关键字参数。这应该行得通。我认为它应该是第一个decorator,即在所有click方法完成后调用它

    def capitalise_input(f):
        def wrapper(**kwargs):
            kwargs['name'] = kwargs['name'].upper()
            f(**kwargs)
        return wrapper
    
    
    @click.command()
    @click.option('--count', default=1, help='Number of greetings.')
    @click.option('--name', prompt='Your name',
                  help='The person to greet.')
    @capitalise_input
    def hello(count, name):
        ....
    
    您也可以尝试这样的方法,以确定要大写的参数:

    def capitalise_input(key):
        def decorator(f):
            def wrapper(**kwargs):
                kwargs[key] = kwargs[key].upper()
                f(**kwargs)
            return wrapper
        return decorator
    
    @capitalise_input('name')
    def hello(count, name):
    

    哈维的回答对指挥小组不起作用。实际上,这会将“hello”命令替换为“wrapper”,这不是我们想要的。相反,尝试以下方法:

    from functools import wraps
    
    def test_decorator(f):
        @wraps(f)
        def wrapper(*args, **kwargs):
            kwargs['name'] = kwargs['name'].upper()
            return f(*args, **kwargs)
        return wrapper
    

    关于单击命令组-我们需要考虑文档中的内容-

    所以最后一个简单的装饰器是这样的:

    def sample_decorator(f):
        def run(*args, **kwargs):
            return f(*args, param="yea", **kwargs)
        return run
    
    需要转换为与单击一起使用:

    from functools import update_wrapper
    
    def sample_decorator(f):
        @click.pass_context
        def run(ctx, *args, **kwargs):
            return ctx.invoke(f, *args, param="yea", **kwargs)
        return update_wrapper(run, f)
    

    (文档建议使用
    ctx.invoke(f,ctx.obj,
    ),但这导致了“duplicite参数”错误。)

    谢谢!我测试了它,这两项工作都是我需要的,特别是“which参数”版本。当我尝试对组执行此操作时,我看到以下错误:
    AttributeError:“function”对象没有属性“command”
    在我的情况下,即使在使用
    @wrapps
    后,命令仍将转换为