python 修饰函数调用
python decorate function call
我最近了解了装饰器,想知道是否可以不在函数定义中而是在函数调用中使用它们,作为某种通用包装器。
这样做的原因是,我想通过用户定义的接口调用模块中的函数,该接口对函数执行可重复的操作,我不想为每个函数都实现一个包装器。
原则上我想要
def a(num):
return num
@double
a(2)
返回 4 而无需访问 a
的实现。
或者在这种情况下会像
这样的全局包装器
def mutiply(factor,function,*args,**kwargs):
return factor*function(*args,*kwargs)
是更好的选择吗?
你可以这样做:
def a(num):
return num * 1
def double(f):
def wrapped(*args, **kwargs):
return f(*args, **kwargs)
return wrapped
print(double(a)(2))
这是因为我们可以装饰函数,运行 函数可以像上面的例子那样使用显式装饰器函数。
所以在这一篇中:
print(double(a)(2))
您可以在 a
的位置放置任何函数,并在 2
、args 和 kwargs 的位置。
在 Apress 的 Marty Alchin 的书 Pro Python 中有一个关于装饰器的非常详细的部分。
虽然新样式的@decorator 语法仅可用于 function/class 定义,但您可以使用旧语法,以这种方式做同样的事情:
from module import myfunc
myfunc = double_decorator(myfunc)
x = myfunc(2) # returns 4
我发现一个有用的方法是定义一个装饰的新函数
def my_function():
pass
@my_decorator
def my_function_with_decorator(*args, **kwargs):
my_function()
my_function() # call without decorator
my_function_with_decorator() # call with decorator
我最近了解了装饰器,想知道是否可以不在函数定义中而是在函数调用中使用它们,作为某种通用包装器。
这样做的原因是,我想通过用户定义的接口调用模块中的函数,该接口对函数执行可重复的操作,我不想为每个函数都实现一个包装器。
原则上我想要
def a(num):
return num
@double
a(2)
返回 4 而无需访问 a
的实现。
或者在这种情况下会像
def mutiply(factor,function,*args,**kwargs):
return factor*function(*args,*kwargs)
是更好的选择吗?
你可以这样做:
def a(num):
return num * 1
def double(f):
def wrapped(*args, **kwargs):
return f(*args, **kwargs)
return wrapped
print(double(a)(2))
这是因为我们可以装饰函数,运行 函数可以像上面的例子那样使用显式装饰器函数。 所以在这一篇中:
print(double(a)(2))
您可以在 a
的位置放置任何函数,并在 2
、args 和 kwargs 的位置。
在 Apress 的 Marty Alchin 的书 Pro Python 中有一个关于装饰器的非常详细的部分。
虽然新样式的@decorator 语法仅可用于 function/class 定义,但您可以使用旧语法,以这种方式做同样的事情:
from module import myfunc
myfunc = double_decorator(myfunc)
x = myfunc(2) # returns 4
我发现一个有用的方法是定义一个装饰的新函数
def my_function():
pass
@my_decorator
def my_function_with_decorator(*args, **kwargs):
my_function()
my_function() # call without decorator
my_function_with_decorator() # call with decorator