繁体   English   中英

如何将未知的参数列表发送给python装饰器?

[英]How can I send unknown list of arguments to a python decorator?

我创建了一个python装饰器,如下所示。 我希望这个装饰器接受一个未知的参数列表。 但是下面的代码不起作用。

#!/usr/bin/env python

from functools import wraps

def my_decorator(decorated_function, **kwargs):

    print "kwargs = {}".format(kwargs)
    @wraps(decorated_function)
    def inner_function(*args, **kwargs):
        print "Hello world"
        return decorated_function(*args, **kwargs)
    return inner_function

@my_decorator(arg_1="Yolo", arg2="Bolo")
def my_func():
     print "Woo Hoo!"


my_func()

当我运行它时,我收到此错误:

 File "./decorator_test.py", line 14, in <module>
     @my_decorator(arg_1="Yolo", arg2="Bolo")
 TypeError: my_decorator() takes exactly 1 argument (0 given)

为什么**kwargs不接受我发送到装饰器的多个参数? 我该如何解决?

基本上,当你有一个接受参数的装饰器时,你有两次调用它,一次用关键字参数调用,然后再调用一个要装饰的函数。

@deco语法之前, @deco将函数传递给装饰器函数即可修饰函数

func = deco(func)

如果你想包含其他关键字参数,你可以同时传递它们

func = deco(func, arg=True, arg2=5)

但是@deco语法不允许这样,它更像是这样,所以你正在调用装饰器函数返回的函数。

func = deco(arg=True, arg2=5)(func)

要使用@deco语法执行此@deco ,您将创建一个装饰器,用于测试是否仅使用函数(装饰部分)调用它,或者是否使用关键字参数调用它(设置要传递的装饰器)功能)。

def deco_with_kwargs(func=None, **kwargs):

    def deco(func_):

        def wrapped_func(*fargs, **fkwargs):
            print kwargs
            return func_(*fargs, **fkwargs)
        return wrapped_func

    if func:
        return deco(func)
    else:
        return deco

您可以在没有任何关键字参数的情况下使用它。

@deco_with_args
def my_func():
    return 1

或者您可以使用关键字参数调用它。 在这种情况下,您实际上正在调用装饰器函数,该函数返回另一个装饰器函数,然后调用该函数来实际装饰该函数。

@deco_with_args(test=True)
def my_func():
    return 1

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM