【问题标题】:Python decorator runs during import before function is calledPython 装饰器在导入期间在调用函数之前运行
【发布时间】:2019-09-05 00:00:01
【问题描述】:

我正在尝试使用装饰器check_wake_server 在执行与该主机交互的host_function 之前检查远程主机是否可用。我遇到的问题是,在调用 host_function 之前,装饰器会在导入期间立即启动。

check_wake_serverhost_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 你的建议解决了我的问题。我需要将代码移动到包装函数中以获得预期的行为。谢谢!

标签: python python-decorators


【解决方案1】:

@Nickolay 的评论让我得到了想要的行为:

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

所以解决办法是:

def check_wake_server(func):
    @functools.wraps(func)
    def host_wrapper(func):
        # check/wake server logic goes here
        print('Decoration is happening!')
        return func(*args, **kwargs)  
    return host_wrapper

【讨论】:

    猜你喜欢
    • 2010-09-25
    • 1970-01-01
    • 2017-08-20
    • 2015-10-27
    • 2010-09-21
    • 2013-04-07
    • 2013-01-20
    • 1970-01-01
    相关资源
    最近更新 更多