Декоратор - это вызываемый объект, который принимает класс или функцию и возвращает класс или функцию.Синтаксис декоратора:
@decorator # note no ()
def function():
...
То, что вы делаете, вызывает decorator
, а затем использует результат этого вызова (wrapper
) для украшения welcome
.wrapper
поэтому запускается немедленно.
То, что вы намеревались написать, вероятно, было
def decorator(func):
def wrapper(*args, **kwargs):
global log_stat
while not log_stat:
username = input("username")
password = input("password")
if username == "123" and password == "456":
log_stat = True
return func(*args, **kwargs)
else:
print("try again") # I would raise an exception here
return wrapper
@decorator
def welcome():
print("welcome")
Обратите внимание, что wrapper
принимает аргументы в этой версии.Это потому, что когда вы украшаете welcome
, оно заменяется wrapper
.Поэтому, если ваша функция welcome
принимает аргументы, ваша wrapper
также должна будет принимать их, чтобы передать их исходной функции.