我想使用装饰器来转换函数的参数。
所以不要这样做:
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):
...
但我对这个功能感到非常不舒服。
如何编写这样的装饰器?
答案 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))
这只适用于现在的普通参数,而不是关键字参数。不过,这样做也相当容易。