【问题标题】:python: pickling c objectspython:酸洗c对象
【发布时间】:2012-09-21 12:09:13
【问题描述】:

首先我并不期待解决方案,只是希望获得一些关于如何开始的指示。

我有一个带有嵌入式 Python 解释器的 C 程序。程序用作输入的 Python 脚本显然是指 C 定义的对象和函数。我现在想让这些对象中的一些可腌制。

pickle 文档描述了如何使用__reduce__ 使扩展类型变得可picklable。但这是一个 Python 方法 - 我将如何在底层 PyObject 中定义它?

我很确定我误解了一些东西......

【问题讨论】:

    标签: python pickle


    【解决方案1】:

    pickle 模块有 Python-only 和 C 变体(称为cPickle)。因此,__reduce__ 方法需要可以从 Python 代码中调用。

    因此,您需要在您的 C 对象 PyMethodDef struct 中提供一个 __reduce__ 条目并使用合适的实现。

    或者,您也可以使用copy_reg module 注册酸洗功能。这个模块的原始用例是为了更好地支持扩展模块;模块状态的source code

    这仅适用于为 C 中定义的扩展类型添加 pickle 支持,而不适用于用户定义类的实例。

    【讨论】:

    • 啊哈,谢谢你让我明白了!所以假设我有一个 C 对象“MyObj”,它已经有一个 static PyMethodDef MyObj [] 结构,如果我添加一个条目 "__reduce__" 指向一个C 函数,这可以从 Pickle 和 cPickle 调用吗?
    • 没错。 cPickle 模块通过PyObject_GetAttr() 查找方法。
    猜你喜欢
    • 1970-01-01
    • 2010-12-30
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-19
    相关资源
    最近更新 更多