【问题标题】:Import standard Python library from C从 C 导入标准 Python 库
【发布时间】:2016-02-07 11:50:54
【问题描述】:

我正在写一个 Python 3 C extension,我想在其中使用 MappingProxyType (from types import MappingProxyType)。从我在 Cpython 源代码中看到的,MappingProxyType 是用 Python 而不是 C 编写的。

如何在 C 语言中使用这种类型?我想一定有类似 C 级“导入”的东西,然后我可以从 C 字符串的名称中找到 PyObject(或者更确切地说,PyTypeObject)。

【问题讨论】:

    标签: python c python-3.x python-c-extension


    【解决方案1】:

    有一个C API 用于导入模块。那么你只需要从模块中获取MappingProxyType类型属性:

    static PyTypeObject *import_MappingProxyType(void) {
        PyObject *m = PyImport_ImportModule("types");
        if (!m) return NULL;
        PyObject *t = PyObject_GetAttrString(m, "MappingProxyType");
        Py_DECREF(m);
        if (!t) return NULL;
        if (PyType_Check(t))
            return (PyTypeObject *) t;
        Py_DECREF(t);
        PyErr_SetString(PyExc_TypeError, "not the MappingProxyType type");
        return NULL;
    }
    

    【讨论】:

    • 您忘记检查 getattr 上的错误。在实践中它不太可能失败,但有人可能已经对模块进行了猴子修补。
    • @Kevin 没必要。如果tNULL,则函数只返回NULLt 永远不会被使用,所以它是安全的。
    • 如果tNone 或者不是PyTypeObject 怎么办?
    猜你喜欢
    • 2020-11-13
    • 1970-01-01
    • 2018-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    相关资源
    最近更新 更多