@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>

?

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

Спасибо заранее!
  • Вопрос задан
  • 188 просмотров
Решения вопроса 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
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы