Python导入模块指定变量时如何避免执行其他无关耗时计算
问题解答
Python默认的导入机制会执行被导入模块顶层的所有可执行代码,因此常规写法下只要导入variables模块的任意内容,a对应的耗时计算一定会被触发。但可以通过Python内置的模块级钩子实现需求,不需要额外定义业务函数,方案如下:
方案1:使用模块级__getattr__延迟加载(推荐,Python 3.7+支持)
这是最符合你需求的方案,既可以实现仅导入b时不计算a,也能保留后续导入a的能力,且导入侧代码无需任何修改。
你只需要将variables.py的内容改写为:
def __getattr__(name): if name == "b": return 1 elif name == "a": # 仅当主动导入a时才执行耗时计算 return [i ** i for i in range(10000)] raise AttributeError(f"module {__name__} has no attribute {name}")
原理是Python 3.7及以上版本支持模块层面的__getattr__方法,当访问模块中不存在的属性时会自动触发该方法,不会提前执行所有顶层计算逻辑,完全匹配你设想的variable_being_imported判断逻辑。
方案2:将无需导出的计算放入if __name__ == '__main__'块
如果你确定a完全不需要对外导出,只有直接运行variables.py时才需要用到,可以用该方案:
b = 1 if __name__ == '__main__': # 仅当直接运行该脚本时才会执行该计算,导入时不会触发 a = [i ** i for i in range(10000)]
该方案的缺点是其他代码无法通过导入拿到a变量,适合不需要对外暴露a的场景。
内容的提问来源于stack exchange,提问作者Nathan Dai
相关产品推荐
相关产品推荐

