]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
[3.11] gh-93741: Add private C API _PyImport_GetModuleAttrString() (GH-93742) (GH...
authorMiss Islington (bot) <31488909+miss-islington@users.noreply.github.com>
Thu, 16 Jun 2022 07:19:29 +0000 (00:19 -0700)
committerGitHub <noreply@github.com>
Thu, 16 Jun 2022 07:19:29 +0000 (00:19 -0700)
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)
(cherry picked from commit d42b3689f4a14694f5b1ff75c155141102aa2557)

Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
Include/cpython/import.h
Python/import.c

index dd5bbdbad78cb75a703d95211fbafe1827d00c0b..419945f710daabadd6c52f327d6f3592be4c86a7 100644 (file)
@@ -41,3 +41,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 acfe96963ca34e0f97a3497cdec1b4b51c70ac1c..58d111705a4daede39a7df7c51b8ebb1f7636455 100644 (file)
@@ -2294,6 +2294,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