[3.11] gh-93741: Add private C API _PyImport_GetModuleAttrString() (GH-93742) (GH-93792)

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 6fd4c8ec77)
This commit is contained in:
Serhiy Storchaka 2022-06-14 08:51:39 +03:00 committed by GitHub
parent 02ff1ccfb7
commit d42b3689f4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 34 additions and 0 deletions

View 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 *);

View 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