Может ли декоратор python работать со временем выполнения выражения лямбда?
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", связать либо
Спасибо за любой намек.
Rgs,
KC
ну, вот информация об ошибке, я думаю, что выше код не может работать, тогда я никогда не пытаюсь вставить в 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
>>>
Ответы
Ответ 1
Синтаксис декоратора - это просто синтаксический сахар, хотя он и направляет мысли людей в интересные направления.
@expr
def f(...):
...
совпадает с
def f(...):
...
f = expr(f)
Итак, вы можете просто использовать attrs(argument_types=..., ...)(lambda: ...)
.
Ответ 2
Синтаксис @
- это просто синтаксический сахар для вызова декоратора со следующей функцией в качестве аргумента. Это означает, что
@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))