Подтвердить что ты не робот

Может ли декоратор 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
>>> 
4b9b3361

Ответ 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))