mirror of https://github.com/python/cpython
[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:
parent
02ff1ccfb7
commit
d42b3689f4
|
@ -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 *);
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in New Issue