def attrs(**kwds):
def decorate(f):
for k in kwds:
setattr(f, k, kwds[k])
return f
return decorate
@attrs(argument_types=(int, int,), returns=int)
def add(a, b):
return a + b
这里我需要add()可以显示其可接受的参数类型。 但是我可以在运行时做这样的事吗?
ladd=[]
for x in range(0,10):
@attrs(argument_types=int, returns=int,default_parameter1 = x)
exp = lambda : add(a,x)
ladd.append(exp)
或
ladd=[]
for x in range(0,10):
@attrs(argument_types=int, returns=int,default_parameter1 = x)
addx = functools.partial(add, 2)
ladd.append(addx)
我需要那些函数可以生成运行时使用“decoratored”参数绑定
嗯,这里是错误信息,我认为上面的代码无法正常工作,但我从未尝试将其粘贴到python中进行测试...
>>> ladd=[]
>>> for x in range(0,10):
... @attrs(argument_types=int, returns=int,default_parameter1 = x)
... exp = lambda : add(a,x)
File "<stdin>", line 3
exp = lambda : add(a,x)
^
SyntaxError: invalid syntax
>>> ladd.append(exp)
File "<stdin>", line 1
ladd.append(exp)
^
IndentationError: unexpected indent
>>>
答案 0 :(得分:10)
装饰器语法只是语法糖,虽然它将人们的想法引导到有趣的方向。
@expr
def f(...):
...
与
相同def f(...):
...
f = expr(f)
所以你可以使用attrs(argument_types=..., ...)(lambda: ...)
。
答案 1 :(得分:8)
@
语法只是用于调用装饰器的语法糖,下一个函数是它的参数。这意味着
@deco
def func(): pass
与
相同def func(): pass
func = deco(func)
所以你想要的只是:
ladd=[]
for x in range(0,10):
deco = attrs(argument_types=int, returns=int,default_parameter1 = x)
addx = functools.partial(add, 2)
# append the "decorated" function
ladd.append(deco(addx))