如何将未知参数列表发送给 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
语法之前,您可以通过将函数传递给装饰器函数来装饰它
func = deco(func)
如果你想包含其他关键字参数,你可以同时传入它们
func = deco(func, arg=True, arg2=5)
但是 @deco
语法不允许这样做,它的工作原理更像是这样,所以你正在调用装饰器函数 returned 的函数。
func = deco(arg=True, arg2=5)(func)
要使用 @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
或者您可以像这样使用关键字参数来调用它。在这种情况下,您实际上是在调用装饰器函数,returns 另一个装饰器函数,然后调用它来实际装饰函数。
@deco_with_args(test=True)
def my_func():
return 1
我创建了一个 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
语法之前,您可以通过将函数传递给装饰器函数来装饰它
func = deco(func)
如果你想包含其他关键字参数,你可以同时传入它们
func = deco(func, arg=True, arg2=5)
但是 @deco
语法不允许这样做,它的工作原理更像是这样,所以你正在调用装饰器函数 returned 的函数。
func = deco(arg=True, arg2=5)(func)
要使用 @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
或者您可以像这样使用关键字参数来调用它。在这种情况下,您实际上是在调用装饰器函数,returns 另一个装饰器函数,然后调用它来实际装饰函数。
@deco_with_args(test=True)
def my_func():
return 1