Python 为什么这个decorator中的包装函数会自动运行而不调用它们?
我正在探索如何在Python3中使用decorator。我在编辑器中键入这些代码,然后单击“运行”按钮Python 为什么这个decorator中的包装函数会自动运行而不调用它们?,python,python-3.x,function,python-decorators,syntactic-sugar,Python,Python 3.x,Function,Python Decorators,Syntactic Sugar,我正在探索如何在Python3中使用decorator。我在编辑器中键入这些代码,然后单击“运行”按钮 log_stat = False def decorator(): def wrapper(func): global log_stat while not log_stat: username = input("username") password = input("password")
log_stat = False
def decorator():
def wrapper(func):
global log_stat
while not log_stat:
username = input("username")
password = input("password")
if username == "123" and password == "456":
func()
log_stat = True
else:
print("try again")
return wrapper
@decorator()
def welcome():
print("welcome")
我不希望在屏幕上显示任何内容,因为我认为我所做的只是定义函数,而不是调用或执行它们。但是python让我输入用户名和密码,看起来它实际上运行了包装函数
真正的原因是什么?我如何定义函数而不触发包装函数呢?因为您在使用它时调用了decorator。这意味着它在导入时运行。你应该去掉括号
@decorator
def welcome():
print("welcome")
(可以定义一个在导入时调用的decorator,即它接受参数;但要做到这一点,您必须实现另一个级别的包装,以便函数返回一个decorator,而这个decorator又返回一个包装原始文件的函数。)因为您在使用decorator时调用了它。这意味着它在导入时运行。你应该去掉括号
@decorator
def welcome():
print("welcome")
(可以定义在导入时调用的decorator,即它接受参数;但要做到这一点,必须实现另一个级别的包装,以便函数返回decorator,而decorator又返回包装原始参数的函数。)装饰器是一种可调用函数,它接受一个类或函数并返回一个类或函数。decorator语法是
@decorator # note no ()
def function():
...
您要做的是调用装饰器
,然后使用该调用的结果(包装器
)装饰欢迎
<因此,代码>包装器会立即运行
你打算写的可能是
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
时,它会被包装器所取代。因此,如果您的welcome
函数接受了参数,那么您的包装器也必须接受这些参数才能将它们传递给原始函数。装饰器是一种可调用函数,它接受类或函数并返回类或函数。decorator语法是
@decorator # note no ()
def function():
...
您要做的是调用装饰器
,然后使用该调用的结果(包装器
)装饰欢迎
<因此,代码>包装器
会立即运行
你打算写的可能是
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
时,它会被包装器所取代。因此,如果您的welcome
函数接受了参数,那么您的包装器也必须接受这些参数才能将它们传递给原始函数。我们在这里讨论的是哪个编辑器?很抱歉没有提及。我正在使用PyCharm的编辑器。我们在这里谈论的是哪个编辑器?很抱歉没有提及。我正在使用PyCharm的编辑器。很抱歉我之前的评论失败,我不知道如何在评论中正确插入代码。非常感谢你!!!我已经重写了我的代码,我在welcome
中添加了一些参数,并将它们打印出来,结果成功了!因此,在本例中,包装器
实际上并不使用参数,它只存储这些参数供func
使用?这是否正确?@yjyj它可以使用参数,但在这种情况下它不能使用。很抱歉我之前的注释失败,我不知道如何在注释中正确插入代码。非常感谢你!!!我已经重写了我的代码,我在welcome
中添加了一些参数,并将它们打印出来,结果成功了!因此,在本例中,包装器
实际上并不使用参数,它只存储这些参数供func
使用?这是正确的吗?@yjyj它可以使用参数,但在这种情况下就不行了。非常感谢!!!我添加了另一个外部装饰器,为它提供了参数,以便在导入和测试时调用它。成功了!所以在导入之后,最外层的装饰器被最外层的装饰器返回的内部装饰器替换,当我调用包装函数时,真正发生的是调用内部装饰器(外部装饰器的名称)?这是正确的吗?非常感谢!!!我添加了另一个外部装饰器,为它提供了参数,以便在导入和测试时调用它。成功了!所以在导入之后,最外层的装饰器被最外层的装饰器返回的内部装饰器替换,当我调用包装函数时,真正发生的是调用内部装饰器(外部装饰器的名称)?这是正确的吗?