]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-93741: Add private C API _PyImport_GetModuleAttrString() (GH-93742) (GH...
authorSerhiy Storchaka <storchaka@gmail.com>
Tue, 14 Jun 2022 05:51:39 +0000 (08:51 +0300)
committerGitHub <noreply@github.com>
Tue, 14 Jun 2022 05:51:39 +0000 (08:51 +0300)
It combines PyImport_ImportModule() and PyObject_GetAttrString()
and saves 4-6 lines of code on every use.

Add also _PyImport_GetModuleAttr() which takes Python strings as arguments.
(cherry picked from commit 6fd4c8ec7740523bb81191c013118d9d6959bc9d)

Include/cpython/import.h
Python/import.c

index ef6be689468ee5bee94db73bf4524e23b5bb2dbe..a69b4f34def342adbb3f23a3a727a350737bff54 100644 (file)
@@ -40,3 +40,6 @@ struct _frozen {
    collection of frozen modules: */
 
 PyAPI_DATA(const struct _frozen *) PyImport_FrozenModules;
+
+PyAPI_DATA(PyObject *) _PyImport_GetModuleAttr(PyObject *, PyObject *);
+PyAPI_DATA(PyObject *) _PyImport_GetModuleAttrString(const char *, const char *);
index 4b6d6d16821a9430ce896137474532e618872da7..ca728c424766c7b31bb5e1c60b9b8bedee49c4a6 100644 (file)
@@ -2632,6 +2632,37 @@ PyImport_AppendInittab(const char *name, PyObject* (*initfunc)(void))
     return PyImport_ExtendInittab(newtab);
 }
 
+
+PyObject *
+_PyImport_GetModuleAttr(PyObject *modname, PyObject *attrname)
+{
+    PyObject *mod = PyImport_Import(modname);
+    if (mod == NULL) {
+        return NULL;
+    }
+    PyObject *result = PyObject_GetAttr(mod, attrname);
+    Py_DECREF(mod);
+    return result;
+}
+
+PyObject *
+_PyImport_GetModuleAttrString(const char *modname, const char *attrname)
+{
+    PyObject *pmodname = PyUnicode_FromString(modname);
+    if (pmodname == NULL) {
+        return NULL;
+    }
+    PyObject *pattrname = PyUnicode_FromString(attrname);
+    if (pattrname == NULL) {
+        Py_DECREF(pmodname);
+        return NULL;
+    }
+    PyObject *result = _PyImport_GetModuleAttr(pmodname, pattrname);
+    Py_DECREF(pattrname);
+    Py_DECREF(pmodname);
+    return result;
+}
+
 #ifdef __cplusplus
 }
 #endif