Viji
@Viji
DevOps Engineer

Почему такой порядок вывода на консоль при использовании декораторов?

след код:
from functools import wraps

def makebold(original_funct): # decorator
    @wraps(original_funct) # optional, only require to keep track of the original function name thru wrapping
    def wrapped_4_bold(*args, **kwargs):
        print("Bold wrapped function name: {} received arguments: args = {} and kwargs = {}".format(original_funct.__name__, *args,
                                                                                                **kwargs))
        result = original_funct(*args, **kwargs)
        print("Bold wrapped function completed")
        return "<b>" + result + "</b>"

    return wrapped_4_bold


def makeitalic(original_funct): # decorator
    @wraps(original_funct) # optional, only require to keep track of the original function name thru wrapping
    def wrapped_4_italic(*args, **kwargs):
        print("Italic wrapped function name: {} received arguments:: args = {} and kwargs = {}".format(original_funct.__name__, *args,
                                                                                                   **kwargs))
        result = original_funct(*args, **kwargs)
        print("Italic wrapped function completed")
        return "<i>" + result + "</i>"

    return wrapped_4_italic

@makebold #executed second
@makeitalic # executed first
def hello_function(stext, small_letters=True):
    if small_letters:
        return stext.lower()
    else:
        return stext.upper()

print(hello_function("давайте попробуем", False))

выводит в консоль:
Bold wrapped function name: hello_function received arguments: args = давайте попробуем and kwargs = False
Italic wrapped function name: hello_function received arguments:: args = давайте попробуем and kwargs = False
Italic wrapped function completed
Bold wrapped function completed
ДАВАЙТЕ ПОПРОБУЕМ

Вопрос почему начинает принтовать в таком порядке - словно Bold wrapper начался первым, потом его перехватил Italic и закончил опять Bold...
  • Вопрос задан
  • 95 просмотров
Пригласить эксперта
Ответы на вопрос 1
@twistfire92
Python backend developer
Представим декоратор makebold фигурными скобками { }
А декоратор makeitalic - квадратными скобками [ ]
Открывающаяся скобка - код до вызова декорируемой функции, закрывающаяся - код после выполнения декорируемой функции.
Декорируемая функция пусть будет многоточием ...

Тогда ход выполнения вашей программы можно описать так: { [ ... ] }
А теперь прочитайте это слева направо.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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