Страницы

Поиск по вопросам

воскресенье, 9 февраля 2020 г.

Декоратор в python, мини вопрос

#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

Комментариев нет:

Отправить комментарий