如何判断具有依赖项的 Python 函数是否已更改?

ras*_*use 6 python caching function introspection memoization

tl;博士:

如何将 Python 函数的结果缓存到磁盘并在以后的会话中使用缓存的值,当且仅当函数代码及其所有依赖项自我上次运行以来都没有改变?

换句话说,我想制作一个 Python 缓存系统,可以自动监视更改的代码。

背景

我正在尝试构建一个工具来自动记录 Python 的计算结果。我希望记忆在 Python 会话之间保持不变(即以后可以在另一个 Python 实例中重用,最好甚至在具有相同 Python 版本的另一台机器上)。

假设我有一个mymodule带有一些函数的 Python 模块mymodule.func()。假设我已经解决了序列化/识别函数参数的问题,所以mymodule.func()如果它简化了任何东西,我们可以假设它不带参数。

还假设我保证该函数mymodule.func()及其所有依赖项都是确定性的,因此mymodule.func() == mymodule.func().

任务

我想mymodule.func()今天运行该函数并保存其结果(以及解决此任务所需的任何其他信息)。当我以后想要相同的结果时,我想加载缓存的结果而不是mymodule.func()再次运行,前提是代码mymodule.func()及其依赖项未更改。

为简化起见,我们可以假设该函数始终在新启动的 Python 解释器中运行,并使用如下最小脚本:

import some_save_function
import mymodule
result = mymodule.func()
some_save_function(result, 'filename')
Run Code Online (Sandbox Code Playgroud)

另外,请注意,我不想过于保守。第一次运行时,使用modulefinder模块查找所有涉及的模块可能并不太难,如果有任何模块发生变化,则不使用缓存。但这违背了我的目的,因为在我的用例中,导入模块中的一些不相关的功能很可能发生了变化。

我看过的以前的工作和工具

  • joblib记住与函数名称相关的结果,并保存源代码,以便我们检查它是否未更改。但是,据我所知,它不会检查上游函数(由 调用mymodule.func())。
  • AST模块给我的任何Python代码的抽象语法树,所以我想我可以(原则上)图这一切了这种方式。这会有多难?我对 AST 不是很熟悉。
  • 我可以使用莳萝内部发生的所有黑魔法吗?
  • 比解决方案更琐碎的事情IncPy,一个已完成/已故的研究项目,默认情况下实现了一个 Python 解释器,总是这样做。好主意,但从未在实验室之外实现过。

感谢任何输入!