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函数之前,我试图使用decoratorcheck\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您的建议解决了我的问题。我需要将代码移动到包装器函数中,以获得预期的行为。谢谢