如何获取 python 函数的酸洗依赖项?

Posted

技术标签:

【中文标题】如何获取 python 函数的酸洗依赖项?【英文标题】:How to get a python function's dependencies for pickling? 【发布时间】:2012-04-10 02:08:14 【问题描述】:

作为对这个问题的跟进: How to pickle a python function with its dependencies?

确定方法的依赖关系的好方法是什么?例如,类似于上面的帖子,如果我有一个使用方法 g 和 y 的函数 f,是否有一种简单的方法可以动态获取对 g 和 y 的引用?

此外,我猜您可能希望此方法递归整个函数图,这样如果 y 依赖于 z,您也可以捆绑 z。

我看到迪斯科为此使用了以下模块: https://github.com/discoproject/disco/blob/master/lib/disco/worker/classic/modutil.py

关于如何解决这个问题的任何其他建议? disco 方法似乎是基于模块的,因此您可能需要捆绑比实际执行 root 方法所需的更多内容。

【问题讨论】:

【参考方案1】:

为此,我会使用dill,它可以序列化python 中的几乎任何东西。 Dill 也有 some good tools 帮助您了解在代码失败时导致酸洗失败的原因。

>>> import dill
>>> dill.loads(dill.dumps(your_bad_object))
>>> ...
>>> # if you get a pickling error, use dill's tools to figure out a workaround
>>> dill.detect.badobjects(your_bad_object, depth=0)
>>> dill.detect.badobjects(your_bad_object, depth=1)
>>> ...

如果您绝对愿意,您可以使用 dill 的 badobjects(或其他检测函数之一)递归地深入到对象的引用链中,并弹出不可腌制的对象,而不是在每个深度调用它,如上。

另外,objgraph 也是对测试套件的一个非常方便的补充。

>>> # visualize the references in your bad objects
>>> objgraph.show_refs(your_bad_object, filename='your_bad_object.png')

或者,正如我在您上面提到的帖子中提到的,您可以使用 dill 在一个命令中腌制整个 python 会话。这对你的问题来说有点过分了,但它也可以。

【讨论】:

以上是关于如何获取 python 函数的酸洗依赖项?的主要内容,如果未能解决你的问题,请参考以下文章

如何获取 Python 解释器堆栈的当前深度?

如何检查python函数是否更改(在实时代码中)?

如何在 Python 中解释 Dill 的酸洗跟踪输出? (分析(非)酸洗/(反)序列化瓶颈)

如何在 gradle 中获取依赖项的元数据?

如何检查 pom.xml 以获取更新的依赖项

如何在视图中获取列级依赖项