我想创建一个新的装饰器来代替 @wraps(f)
,它可以完成 @wraps(f)
的所有魔法其他的东西。我该怎么做?
具体来说,我有几个以下形式的装饰器:
def decorator(f):
@wraps(f)
def wrapper(*args, **kwargs):
# does some stuff in here
return f(*args, **kwargs)
if not hasattr(wrapper, '_first_line'):
wrapper._first_line = inspect.getsourcelines(f)[1]
return wrapper
看来我应该能够创建一个像 @wraps_with_first_line(f)
这样的装饰器,它将完成 @wraps(f)
正在做的所有事情以及 如果不是hasattr(wrapper, '_first_line'):wrapper._first_line =spect.getsourcelines(f)[1]
。
最佳答案
您应该遵循添加指向包装函数的 __wrapped__ 属性的良好做法,而不是添加该包装函数的单个属性。 New versions functools.wraps()
会自动执行此操作,但如果您使用的 Python 版本低于 3.2,您也可以轻松扩展 wraps()
以添加 __wrapped__
:
def my_wraps(wrapped, **kwargs):
def decorator(wrapper):
functools.update_wrapper(wrapper, wrapped, **kwargs)
wrapper.__wrapped__ = wrapped
return decorator
编辑:这是一个从可能多重修饰的函数中提取原始函数的函数:
def orig_function(f):
try:
while True:
f = f.__wrapped__
except AttributeError:
return f
关于python - 如何扩展 functools.wraps 装饰器的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10032023/