【问题标题】:Creating Instance of Python Extension Type in C在 C 中创建 Python 扩展类型的实例
【发布时间】:2011-02-04 02:36:54
【问题描述】:

我正在编写一个简单的Vector 实现,作为 C 语言中的 Python 扩展模块,看起来大致如下:

typedef struct {
    PyObject_HEAD
    double x;
    double y;
} Vector;

static PyTypeObject Vector_Type = {
    ...
};

从 Python 调用时创建 Vector 的实例非常简单,但我需要在同一个扩展模块中创建 Vector 实例。我查看了文档,但找不到明确的答案。最好的方法是什么?

【问题讨论】:

    标签: python extension-modules


    【解决方案1】:

    最简单的方法是调用你创建的类型对象,例如使用PyObject_CallFunction -- 不要让名字欺骗你,它可以让你调用 any 可调用的,只是一个函数。

    如果您没有对您的类型对象的引用,可以方便地作为 C 模块的 static 全局引用,您当然可以通过各种方式检索它(例如,从您的模块对象中使用 PyObject_GetAttrString )。但是将 PyObject* 粘贴到 static 模块级 C 变量中可能是最简单和最方便的。

    【讨论】:

    • 当我调用 Vector_Type 时,它​​实际调用的是什么函数?我是否传递了通常用于从 Python 创建实例的相同参数?我还需要 Py_INCREF() 从 PyObject_CallFunction 返回的 PyObject* 吗?
    • 当您通过 Python C API 中的 PyObject_Call... 函数从 C 调用一个类型(或任何其他可调用的)时,它将执行完全相同的步骤(并且需要完全相同的参数)从 Python 调用时。我指出的文档清楚地说 Return value: New reference。 意味着您不需要增加它(了解新的、借用的和被盗的引用对于 C Python API 的编程至关重要,并且文档总是非常明确地说明适用的情况!-)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-09-18
    • 1970-01-01
    相关资源
    最近更新 更多