python - 惰性模块变量——可以吗?

标签 python module variables lazy-loading itunes

我正在尝试找到一种延迟加载模块级变量的方法。

具体来说,我编写了一个小型 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/

相关文章:

python - 字典中的最高值

python - geopandas 可以获取 geopackage(或其他矢量文件)的所有图层吗?

python - 您正在使用 staticfiles 应用程序,而没有将 STATIC_ROOT 设置设置为文件系统路径

node.js - NodeJS 可以保存网站的 session ,然后像浏览器一样运行并导航该网站吗?

python - DataFrame 对象没有属性 'sample'

python - 从 Github 导入 : How to fix ImportError

php - 在youtube iframe中添加变量

css - 基于某些值生成 SCSS mixin?

python - simplejson:加载西类牙字符——utf-8

javascript - 如何仅在第一次调用时在函数内定义变量?