Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
保留签名的Python装饰器(闭包版本)_Python_Python 2.7_Decorator - Fatal编程技术网

保留签名的Python装饰器(闭包版本)

保留签名的Python装饰器(闭包版本),python,python-2.7,decorator,Python,Python 2.7,Decorator,我的装饰是“封闭式”;它在返回修饰过的函数之前做一些工作 借用这个著名的问题: functools.wrapps在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] kwar

我的装饰是“封闭式”;它在返回修饰过的函数之前做一些工作

借用这个著名的问题:

functools.wrapps
在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)
显示

decorator
模块似乎不支持这种风格的decorator

同样相关:

您可以使用该模块

请记住,
wrapt
decorator与标准python decorator具有不同的接口。我强烈建议你阅读这本书。无论如何,这里有一个使用
wrapt.decorator
的decorator的基本实现:

import wrapt

def args_as_ints(f):
    time.sleep(1) # hard at work

    @wrapt.decorator
    def g(f, instance, *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(f)  # apply the decorator to the function
请注意,我的实现完全忽略了
实例
参数,因此对于实例方法它无法正常工作

但是,它确实保留了修饰函数的签名:

Help on function funny_function in module __main__:

funny_function(x, y, z=3)
    Computes x*y + 2*z

在这里找到了答案:


您是否阅读了有关
functools.wrapps
的部分?请澄清。你的问题是什么?您的装饰师在我的机器上正常工作:。请注意,这个著名的问题已经有十年历史了,所以它可能会推荐不再需要的技术。@NilsWerner:哪一部分?我试过了,它没有保留签名请用你所有的努力来修正你的问题对不起,我没有领会你的意思。。。
import wrapt

def args_as_ints(f):
    time.sleep(1) # hard at work

    @wrapt.decorator
    def g(f, instance, *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(f)  # apply the decorator to the function
Help on function funny_function in module __main__:

funny_function(x, y, z=3)
    Computes x*y + 2*z
def args_as_ints(f):

    time.sleep(1)

    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 decorator.FunctionMaker.create(
        f, 'return decfunc(%(signature)s)',
        dict(decfunc=g, __wrapped__=f))