【发布时间】:2020-10-04 08:00:09
【问题描述】:
考虑以下装饰器函数,它要么返回装饰函数,要么返回参数化装饰或函数:
from functools import wraps, partial, update_wrapper
from inspect import signature
def wrapit(func=None, *, verb='calling'):
if func is None: # return a decoratOR
return partial(wrapit, verb=verb)
else: # return a decoratED
@wraps(func)
def _func(*args, **kwargs):
print(f'{verb} {func.__name__} with {args} and {kwargs}')
return func(*args, **kwargs)
return _func
演示:
>>> f = lambda x, y=1: x + y
>>> ff = wrapit(verb='launching')(f)
>>> assert ff(10) == 11
launching <lambda> with (10,) and {}
>>> assert signature(ff) == signature(f)
>>>
>>> # but can also use it as a "decorator factory"
>>> @wrapit(verb='calling')
... def f(x, y=1):
... return x + y
...
>>> assert ff(10) == 11
launching <lambda> with (10,) and {}
>>> assert signature(ff) == signature(f)
类形式可能如下所示:
class Wrapit:
def __init__(self, func, verb='calling'):
self.func, self.verb = func, verb
update_wrapper(self, func)
def __call__(self, *args, **kwargs):
print(f'{self.verb} {self.func.__name__} with {args} and {kwargs}')
return self.func(*args, **kwargs)
但是我们如何让类能够以函数形式所具有的“装饰工厂”模式运行(由if func is None: return partial...实现
我们如何将该技巧集成到装饰器类中?
【问题讨论】:
-
你可以在
__new__做同样的伎俩 -
不确定你的意思@juanpa.arrivillaga。
__new__只上课,那么我如何根据func is None来调整我所做的事情?
标签: python python-3.x python-decorators