在Python扩展中定义类型时,应该在tp_name字段中输入什么?

2024-09-30 10:35:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在开发一个接口,以便Python程序可以调用现有的C++库。如果我理解正确,这样的接口(和C++库)应该作为模块导入,比如^ {CD1}}。接口中的类型被定义为接口的C++侧的静态变量,并使用以下顺序注册为Python:

void PythonRegistrationData::RegisterType(PyObject* module, PyTypeObject* type)
{
    if (type->ob_refcnt < 2)
    {
        if (type->tp_base != NULL)
            RegisterType(module, type->tp_base);
        Py_INCREF(type);
        if (PyType_Ready(type) != 0)
            throw GPython::DummyError();
        PyModule_AddObject(module, type->tp_name, as<PyObject>(type));
    }
}

确保基类在类之前被注册。根据C-API docs,“对于静态分配的类型对象,tpu name字段应该包含一个点。”因此,我用"abc.MyType"初始化{}。当我这样做时,在加载模块之后,当我试图使用类型时,我得到'module' object has no attribute 'MyType'(例如x = abc.MyType(),之前做过import abc)。如果我只使用"MyType",它似乎可以工作,但这似乎与官方文档和教程中的示例相矛盾。在

那么tp_name字段的确切含义是什么,它到底应该包含什么呢?我不把模块名称放进去会有什么影响?在


Tags: 模块name程序类型baseiftype静态
1条回答
网友
1楼 · 发布于 2024-09-30 10:35:57

通过做

PyModule_AddObject(module, type->tp_name, as<PyObject>(type));

使用“”将类型添加到模块(即设置属性)abc.MyType“作为属性名称。这意味着您需要使用getattr(abc, 'abc.MyType')来访问它,如果您想在abc模块上访问它(您不能直接访问名称中带有点的属性)。您应该将tp_name设置为“限定”名称(前面有abc.),而不应该使用tp}名称作为属性名。在

相关问题 更多 >

    热门问题