@gpetrov
web-программист

Можно ли модифицировать вывод декорируемой функции в декораторе?

Уважаемые коллеги,
встал в тупик, похоже, чего-то принципиального не понимаю в работе декораторов (прошу не смеяться :D)

Вот простая функция, которая возвращает текстовую строку:

def pure_text():
    """return a text string without formatting"""
    return "just a text string"


Вот декоратор, который должен первую букву делать заглавной, а остальные - строчными

def capitalize(fn):
    """capitalize the output of the given function
    """
    def wrapper():
        result = fn()
        return capitalize(result)

    return wrapper


Вот код целиком:

def capitalize(fn):
    """capitalize the putput of the given function
    """
    def wrapper():
        result = fn()
        return capitalize(result)

    return wrapper


@capitalize
def pure_text():
    """return a text string without formatting"""
    return "just a text string"


print pure_text()


Почему вместо ожидаемого Just a text string (c большой буквы) выводится

<function wrapper at 0x7f99879636e0>

?

Что нужно исправить, чтобы в декораторе модифицировалась строка, возвращаемая декорируемой функцией?

Спасибо заранее!
  • Вопрос задан
  • 182 просмотра
Решения вопроса 2
@deliro
Агрессивное программирование
Потому что
733cf84358aa403088c9bac2f8370edc.png
Ответ написан
@gpetrov Автор вопроса
web-программист
Нашел решение методом проб и ошибок...

return capitalize(fn)
- не работает

А вот такой вариант оказался рабочим:

return fn().capitalize()

Таким образом, работающий код декоратора:

def capitalize(fn):
    """capitalize the putput of the given function
    """
    def wrapper():
        return fn().capitalize()

    return wrapper
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
deeplay Новосибирск
от 130 000 ₽
от 130 000 ₽
Enjoy PRO Санкт-Петербург
от 140 000 до 180 000 ₽
24 окт. 2020, в 13:21
12000 руб./за проект
24 окт. 2020, в 12:03
1 руб./за проект
24 окт. 2020, в 11:52
90000 руб./за проект