【发布时间】:2019-03-11 06:51:14
【问题描述】:
我的装饰器是“闭包式”;它在返回装饰函数之前做了一些工作。
借用这个著名的问题:Preserving signatures of decorated functions
def args_as_ints(f):
time.sleep(1) # hard at work
def g(*args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g
functools.wraps 在 Python 2 中不保留签名。
from functools import wraps
def args_as_ints(f):
time.sleep(1) # hard at work
@wraps(f)
def g(*args, **kwargs):
args = [int(x) for x in args]
kwargs = dict((k, int(v)) for k, v in kwargs.items())
return f(*args, **kwargs)
return g
@args_as_ints
def funny_function(x, y, z=3):
"""Computes x*y + 2*z"""
return x*y + 2*z
help(funny_function)
表演
Help on function funny_function in module __main__:
funny_function(*args, **kwargs)
Computes x*y + 2*z
decorator 模块似乎不支持这种风格的装饰器。
【问题讨论】:
-
你读过关于
functools.wraps的部分吗? -
请澄清。你的问题是什么?你的装饰器在我的机器上工作正常:ideone.com/9RajlT。请注意,这个著名的问题已有 10 年历史,因此它可能会推荐不再需要的技术。
-
@NilsWerner:哪一部分?我试过了,它不保留签名
-
请尝试修改您的问题
-
啊抱歉,我错过了你的意思...
标签: python python-2.7 decorator