Декоратор выполняется, когда функция определена ; синтаксис декоратора - это просто синтаксис c сахар для применения функции.
@random_color # run set_tag function through decorator function.
def set_tag(tag):
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text
эквивалентен
def set_tag(tag):
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text
set_tag = random_color(set_tag)
Вместо этого вы должны определить свой декоратор так:
def random_color(func):
def wrapper(*args, **kwargs):
r = random.random()
g = random.random()
b = random.random()
print(f'console.set_color({r},{g},{b})')
console.set_color(r,g,b)
return func(*args, **kwargs)
return wrapper
То есть random_color
должен возвращать функцию, которая устанавливает цвет консоли, а затем вызывает исходную функцию.
Кроме того, set_tag
- это не та функция, которую вы хотите украсить: это функция, которая set_tag
создает:
def set_tag(tag):
@random_color
def enclose_text(text):
print( f'<{tag}>{text}</{tag}>')
return enclose_text
Раньше set_tag
была функцией, которая выбирала случайный цвет, настраивала консоль на использование этого цвета, а затем возвращала функцию, которая генерировала бы тег. Я предполагаю, что вызов set_color
влияет на терминал в этот момент, а не когда print
в конечном счете вызывается. Теперь это функция, которая возвращает функцию, которая выбирает случайный цвет , а генерирует тег, используя этот цвет.