#python #декоратор
Допустим вот такой пример: def wrap(f): def newf(*args): return f(*args) return newf @wrap def fun(a,b,c): print("Hello") fun(a=1,b=2,c=3) #не работает, а нужно, чтоб работало как такое реализовать? В newf указано *args, он не знает ни про какие a,b,c Но если я напишу другую fun2(d,e) вместо fun вызову fun2(d=5,e=6), тоже должно работать
Ответы
Ответ 1
Используйте **kwargs def wrap(f): def newf(*args, **kwargs): return f(*args, **kwargs) return newf @wrap def fun(a,b,c): print("Hello") fun(a=1,b=2,c=3) Подробнее про синтаксис с ** можно прочитать, например, здесь https://djangofan.ru/args-kwargs-pythonОтвет 2
Ошибка в том, что вы написали декоратор для неименованных параметров (кортеж), а потом вызываете функцию с помощью словаря: fun(a=1,b=2,c=3) # то же самое что и: fun(**{'a': 1, 'b': 2, 'c': 3}) # а ваш декоратор примает только: fun(*(1, 2, 3)) С помощью вашего декоратора допустимы следующие варианты: def wrap(f): def newf(*args): print("@", args) return f(*args) return newf @wrap def fun1(a, b, c): print("Hello" + str(a+b+c)) @wrap def fun2(a, b, c=3): print("Hello" + str(a+b+c)) @wrap def fun3(a, b=2, c=3): print("Hello" + str(a+b+c)) fun1(*(1, 2, 3)) fun2(*(1, 2)) fun3(*(1,)) Чтобы функция с декоратором могла принимать и кортежи и словари используйте: def wrap(f): def newf(*args, **kwargs): return f(*args, **kwargs) return newf
Комментариев нет:
Отправить комментарий