转换函数参数的装饰器

时间:2015-02-01 21:14:33

标签: python decorator

我想使用装饰器来转换函数的参数。

所以不要这样做:

def get_data(dt, symbol, depth, session):
    dt = to_date(dt)
    ...

def get_data(dt, symbol, depth, session):
    dt = convert(dt, to_date)
    ...

我希望能够写出类似

的内容
@convert('dt', to_date)
def get_data(dt, symbol, depth, session):
    ...

但我对这个功能感到非常不舒服。

如何编写这样的装饰器?

1 个答案:

答案 0 :(得分:3)

稍微摆弄它并学习了很多关于发电机的知识:

def convert(arg, mod):
    def actual_convert(fn):
        if arg not in fn.__code__.co_varnames:
            return fn
        else:
            def new_function(*args, **kwargs):
                l_args = list(args)
                index = fn.__code__.co_varnames.index(arg)
                l_args[index] = mod(l_args[fn.__code__.co_varnames.index(arg)])
                args = tuple(l_args)
                return fn(*args, **kwargs)
            return new_function
    return actual_convert

@convert('x',lambda x: x+1)
def add(x,y):
    return x + y

print("Should be 5:",add(3,1))

这只适用于现在的普通参数,而不是关键字参数。不过,这样做也相当容易。