小编And*_*ows的帖子

嵌套函数装饰器,用于操作python中的参数

我正在编写一个函数装饰器,它将转换应用于函数的第一个参数.如果我只修改一次我的函数,它工作正常,但如果我装饰它们两次我得到一个错误.下面是一些演示该问题的代码,它是我正在处理的代码的简化版本.我已经排除了进行转换的代码,以免分散注意力

from inspect import getargspec
from functools import wraps

def dec(id):
    def _dec(fn):
        @wraps(fn)
        def __dec(*args, **kwargs):
            if len(args):
                return fn(args[0], *args[1:], **kwargs)
            else:
                first_arg = getargspec(fn).args[0]
                new_kwargs = kwargs.copy()
                del new_kwargs[first_arg]
                return fn(kwargs[first_arg], **new_kwargs)
        return __dec
    return _dec

@dec(1)
def functionWithOneDecorator(a, b, c):
    print "functionWithOneDecorator(a = %s, b = %s, c = %s)" % (a, b, c)

@dec(1)
@dec(2)
def functionWithTwoDecorators(a, b, c):
    print "functionWithTwoDecorators(a = %s, b = %s, c = %s)" % (a, b, c)

functionWithOneDecorator(1, 2, …
Run Code Online (Sandbox Code Playgroud)

python decorator inspect kwargs

11
推荐指数
1
解决办法
3396
查看次数

标签 统计

decorator ×1

inspect ×1

kwargs ×1

python ×1