python:用装饰器实现“懒加载”

有时,我们需要在一个函数执行之前加载一些什么,而且只在第一次执行前加载一次。
标题中说这是“懒加载”是因为,如果条件允许,你完全可以手动在程序最开头执行一遍加载,而不用等用到了函数再加载。
常用的解决方法是建个全局变量判断:

loaded = False

def load():
    x = 'bruh'
    print('exec load')
    globals().update(locals()) #同步局部变量到全局

def main():
    global loaded
    if not loaded:
        load()
        loaded = True
    print('exec main')
    print('value of x:',x)

main()
main()
main()

执行结果:

exec load
exec main
value of x: bruh
exec main
value of x: bruh
exec main
value of x: bruh

但是有点麻烦,而且这种情况一多起来,总感觉自己一直在复制粘贴。
下面来看看如何用装饰器抽象这一功能。

loadonce.py

state_dict = {}

def loadonce(loader_func):
    def load_decorator(target_func):
        def decorated(*args, **kwargs):
            loaded = state_dict.get(id(target_func), False)
            if not loaded:
                loader_func()
                state_dict[id(target_func)] = True
            return target_func(*args, **kwargs)
        return decorated
    return load_decorator

test.py

from loadonce import loadonce

def load():
    x = 'bruh'
    print('exec load')
    globals().update(locals()) #同步局部变量到全局

@loadonce(load)
def main():
    print('exec main')
    print('value of x:',x)

main()
main()
main()

test.py执行结果:

exec load
exec main
value of x: bruh
exec main
value of x: bruh
exec main
value of x: bruh
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值