Python decorator在调用函数之前的导入期间运行

Python decorator在调用函数之前的导入期间运行,python,python-decorators,Python,Python Decorators,在执行与该主机交互的host\u函数之前,我试图使用decoratorcheck\u wake\u server检查远程主机是否可用。我遇到的问题是,在调用host\u函数之前,decorator会在导入过程中立即启动 check_wake_server和host_function都是名为foo.py的文件中的顶级函数,该文件没有主函数 #foo.py 导入功能工具 def检查唤醒服务器(func): @functools.wrapps(func) def主机包装器(func): 返回函数(*a

在执行与该主机交互的
host\u函数之前,我试图使用decorator
check\u wake\u server
检查远程主机是否可用。我遇到的问题是,在调用
host\u函数之前,decorator会在导入过程中立即启动

check_wake_server
host_function
都是名为
foo.py
的文件中的顶级函数,该文件没有主函数

#foo.py
导入功能工具
def检查唤醒服务器(func):
@functools.wrapps(func)
def主机包装器(func):
返回函数(*args,**kwargs)
打印('正在进行装饰!')
#检查/唤醒服务器逻辑在这里
返回主机包装器
@检查唤醒服务器
def主机_功能(*args,**kwargs):
#这没用
通过
当我启动口译员时,我得到以下信息:

来自foo导入主机功能的
[1]
装修正在进行!

check_wake_服务器
需要一分钟才能完成,因此我想对其进行组织,以便只有在调用
host_函数
时才运行
check_wake_服务器
。理想情况下,我还应该使用装饰器,这样我就可以将其重新用于与远程主机交互的多个功能。

@Nickolay的评论让我达到了预期的效果:

如果我希望仅在调用修饰函数时执行某些操作,则需要将代码放在包装器中

因此,解决方案是:

def检查唤醒服务器(func):
@functools.wrapps(func)
def主机包装器(func):
#检查/唤醒服务器逻辑在这里
打印('正在进行装饰!')
返回函数(*args,**kwargs)
返回主机包装器

“Python decorator在函数被调用之前在导入期间运行”是的,当然是这样。这就是装饰器的含义,它是在函数定义上运行的,而不是在调用函数时运行。如果您希望代码在调用装饰函数时运行,请将其放入
host\u wrapper
@Nickolay中,如果您只希望它运行一次,则必须实现一些缓存逻辑。@Nickolay您的建议解决了我的问题。我需要将代码移动到包装器函数中,以获得预期的行为。谢谢