【问题标题】:How to get a python function's dependencies for pickling?如何获取 python 函数的酸洗依赖项?
【发布时间】: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 方法所需的更多内容。

【问题讨论】:

    标签: python function pickle


    【解决方案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 会话。这对你的问题来说有点过分了,但它也可以。

    【讨论】:

      猜你喜欢
      • 2013-05-13
      • 1970-01-01
      • 1970-01-01
      • 2014-05-29
      • 1970-01-01
      • 2013-09-28
      • 2012-05-03
      • 2011-04-01
      • 1970-01-01
      相关资源
      最近更新 更多