почему декоратор python делает функцию, возвращающую "None"? - PullRequest
0 голосов
/ 05 октября 2019

Ребята, может кто-нибудь помочь мне понять, почему мой python decorator не работает должным образом?

создал декоратор, который печатал бы упомянутый ниже текст после возврата функции count car_fuel ().

def decor(func):
    def wrapper(a):
        func(a)
        print('Bring 10 coupons and get a gallon of fuel for free')
    return wrapper



@decor
def car_fuel(a):
    b={'petrol':3.6,'diesel':3} #types of fuel and prices
    count = 0
    for i in a.keys():
        if i in b.keys():
            count+= a[i]*b[i]
    return count


abc={'petrol':10} # the fuel that i wanna buy and gallons
print(car_fuel(abc))

Я хочу получить следующий результат:

36 Принесите 10 купонов и получите галлон топлива бесплатно

но что яполучить это:

Принесите 10 купонов и получите галлон топлива бесплатно Нет

Почему бы мне не получить 36 до "Принесите 10 купонов .... предложение и почему оно возвращает None?

Ответы [ 2 ]

3 голосов
/ 05 октября 2019

Поскольку ваша упакованная функция ничего не возвращает - в python это означает неявное return None.

Исправление:

def decor(func):
    def wraper(a):
        ret = func(a) # save return value
        print('Bring 10 coupons and get a gallon of fuel for free')
        return ret    # return it
    return wraper

Вывод:

Bring 10 coupons and get a gallon of fuel for free
36.0
0 голосов
/ 05 октября 2019

Я редактировал декоратор. теперь он работает правильно, спасибо @ rdas.

`def decor(func):
        def wraper(a):
            r=func(a)

            return str(r)+'\n'+'bring 10 coupons and get 10l free fuel'
        return wraper`
...