【发布时间】:2019-09-05 00:00:01
【问题描述】:
我正在尝试使用装饰器check_wake_server 在执行与该主机交互的host_function 之前检查远程主机是否可用。我遇到的问题是,在调用 host_function 之前,装饰器会在导入期间立即启动。
check_wake_server 和 host_function 都是名为 foo.py 的文件中的顶级函数,该文件没有主函数。
# foo.py
import functools
def check_wake_server(func):
@functools.wraps(func)
def host_wrapper(func):
return func(*args, **kwargs)
print('Decoration is happening!')
# check/wake server logic goes here
return host_wrapper
@check_wake_server
def host_function(*args, **kwargs):
# this does nothing
pass
当我启动我的解释器时,我得到以下信息:
[1] from foo import host_function
Decoration is happening!
check_wake_server 需要一分钟才能完成,所以我想构造它,所以 check_wake_server 仅在 host_function 被调用时运行。理想情况下,我还会使用装饰器,这样我就可以将它重新用于与远程主机交互的多个功能。
【问题讨论】:
-
"Python 装饰器在导入期间在调用函数之前运行" 是的,当然可以。这就是装饰器,它在函数定义上运行,而不是在函数被调用时运行。
-
如果你想让你的代码在装饰函数被调用时运行,把它放在
host_wrapper。 -
@Nickolay 完全正确,如果你只想让它运行一次,那么你必须实现一些缓存逻辑。
-
@Nickolay 你的建议解决了我的问题。我需要将代码移动到包装函数中以获得预期的行为。谢谢!