我正在尝试找到一种延迟加载模块级变量的方法。
具体来说,我编写了一个小型 Python 库来与 iTunes 通信,并且我想要一个 DOWNLOAD_FOLDER_PATH
模块变量。不幸的是,iTunes 不会告诉你它的下载文件夹在哪里,所以我编写了一个函数来抓取一些播客轨道的文件路径并爬回目录树,直到找到“下载”目录。
这需要一两秒,所以我希望延迟评估它,而不是在模块导入时。
有什么方法可以在第一次访问模块变量时懒惰地分配它,还是我必须依赖一个函数?
最佳答案
你不能用模块来做到这一点,但你可以把一个类伪装成“好像”它是一个模块,例如,在 itun.py
中,代码...:
import sys
class _Sneaky(object):
def __init__(self):
self.download = None
@property
def DOWNLOAD_PATH(self):
if not self.download:
self.download = heavyComputations()
return self.download
def __getattr__(self, name):
return globals()[name]
# other parts of itun that you WANT to code in
# module-ish ways
sys.modules[__name__] = _Sneaky()
现在任何人都可以 import itun
... 并获得您的 itun._Sneaky()
实例。 __getattr__
可以让您访问 itun.py
中的任何其他内容,这可能比在 中更方便您将其编码为顶级模块对象_偷偷摸摸
!_)
关于python - 惰性模块变量——可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1462986/