gh-109599: Expose CapsuleType via the _types module (#131969)

This commit is contained in:
Adam Turner 2025-04-04 23:37:41 +01:00 committed by GitHub
parent 7473c600a5
commit 231a50fa9a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
10 changed files with 82 additions and 12 deletions

View file

@ -2,7 +2,7 @@
Define names for built-in types that aren't directly accessible as a builtin.
"""
import sys
import _types
# Iterators in Python aren't a matter of type but of protocol. A large
# and changing number of builtin types implement *some* flavor of
@ -14,7 +14,7 @@ FunctionType = type(_f)
LambdaType = type(lambda: None) # Same as FunctionType
CodeType = type(_f.__code__)
MappingProxyType = type(type.__dict__)
SimpleNamespace = type(sys.implementation)
SimpleNamespace = _types.SimpleNamespace
def _cell_factory():
a = 1
@ -49,7 +49,7 @@ MethodWrapperType = type(object().__str__)
MethodDescriptorType = type(str.join)
ClassMethodDescriptorType = type(dict.__dict__['fromkeys'])
ModuleType = type(sys)
ModuleType = type(_types)
try:
raise TypeError
@ -60,7 +60,9 @@ except TypeError as exc:
GetSetDescriptorType = type(FunctionType.__code__)
MemberDescriptorType = type(FunctionType.__globals__)
del sys, _f, _g, _C, _c, _ag, _cell_factory # Not for export
CapsuleType = _types.CapsuleType
del _types, _f, _g, _C, _c, _ag, _cell_factory # Not for export
# Provide a PEP 3115 compliant mechanism for class creation
@ -331,11 +333,4 @@ EllipsisType = type(Ellipsis)
NoneType = type(None)
NotImplementedType = type(NotImplemented)
def __getattr__(name):
if name == 'CapsuleType':
import _socket
return type(_socket.CAPI)
raise AttributeError(f"module {__name__!r} has no attribute {name!r}")
__all__ = [n for n in globals() if n[:1] != '_']
__all__ += ['CapsuleType']
__all__ = [n for n in globals() if not n.startswith('_')] # for pydoc

View file

@ -150,6 +150,7 @@ PYTHONPATH=$(COREPYTHONPATH)
#_socket socketmodule.c
#_statistics _statisticsmodule.c
#_struct _struct.c
#_types _typesmodule.c
#_typing _typingmodule.c
#_zoneinfo _zoneinfo.c
#array arraymodule.c

View file

@ -23,6 +23,7 @@ _sre _sre/sre.c
_sysconfig _sysconfig.c
_thread _threadmodule.c
time timemodule.c
_types _typesmodule.c
_typing _typingmodule.c
_weakref _weakref.c

37
Modules/_typesmodule.c Normal file
View file

@ -0,0 +1,37 @@
/* _types module */
#include "Python.h"
#include "pycore_namespace.h" // _PyNamespace_Type
static int
_types_exec(PyObject *m)
{
if (PyModule_AddObjectRef(m, "CapsuleType", (PyObject *)&PyCapsule_Type) < 0) {
return -1;
}
if (PyModule_AddObjectRef(m, "SimpleNamespace", (PyObject *)&_PyNamespace_Type) < 0) {
return -1;
}
return 0;
}
static struct PyModuleDef_Slot _typesmodule_slots[] = {
{Py_mod_exec, _types_exec},
{Py_mod_multiple_interpreters, Py_MOD_PER_INTERPRETER_GIL_SUPPORTED},
{Py_mod_gil, Py_MOD_GIL_NOT_USED},
{0, NULL}
};
static struct PyModuleDef typesmodule = {
.m_base = PyModuleDef_HEAD_INIT,
.m_name = "_types",
.m_doc = "Define names for built-in types.",
.m_size = 0,
.m_slots = _typesmodule_slots,
};
PyMODINIT_FUNC
PyInit__types(void)
{
return PyModuleDef_Init(&typesmodule);
}

View file

@ -19,6 +19,7 @@ extern PyObject* PyInit__operator(void);
extern PyObject* PyInit__signal(void);
extern PyObject* PyInit__statistics(void);
extern PyObject* PyInit__sysconfig(void);
extern PyObject* PyInit__types(void);
extern PyObject* PyInit__typing(void);
extern PyObject* PyInit_time(void);
extern PyObject* PyInit__thread(void);
@ -107,6 +108,7 @@ struct _inittab _PyImport_Inittab[] = {
{"time", PyInit_time},
{"_thread", PyInit__thread},
{"_tokenize", PyInit__tokenize},
{"_types", PyInit__types},
{"_typing", PyInit__typing},
{"_statistics", PyInit__statistics},

View file

@ -485,6 +485,7 @@
<ClCompile Include="..\Modules\_sysconfig.c" />
<ClCompile Include="..\Modules\_threadmodule.c" />
<ClCompile Include="..\Modules\_tracemalloc.c" />
<ClCompile Include="..\Modules\_typesmodule.c" />
<ClCompile Include="..\Modules\_typingmodule.c" />
<ClCompile Include="..\Modules\timemodule.c" />
<ClCompile Include="..\Modules\xxsubtype.c" />

View file

@ -998,6 +998,9 @@
<ClCompile Include="..\Modules\_statisticsmodule.c">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="..\Modules\_typesmodule.c">
<Filter>Modules</Filter>
</ClCompile>
<ClCompile Include="..\Modules\_typingmodule.c">
<Filter>Modules</Filter>
</ClCompile>

View file

@ -94,6 +94,7 @@ static const char* _Py_stdlib_module_names[] = {
"_tkinter",
"_tokenize",
"_tracemalloc",
"_types",
"_typing",
"_uuid",
"_warnings",

28
configure generated vendored
View file

@ -783,6 +783,8 @@ MODULE__INTERPRETERS_FALSE
MODULE__INTERPRETERS_TRUE
MODULE__TYPING_FALSE
MODULE__TYPING_TRUE
MODULE__TYPES_FALSE
MODULE__TYPES_TRUE
MODULE__STRUCT_FALSE
MODULE__STRUCT_TRUE
MODULE_SELECT_FALSE
@ -31008,6 +31010,28 @@ then :
fi
if test "$py_cv_module__types" != "n/a"
then :
py_cv_module__types=yes
fi
if test "$py_cv_module__types" = yes; then
MODULE__TYPES_TRUE=
MODULE__TYPES_FALSE='#'
else
MODULE__TYPES_TRUE='#'
MODULE__TYPES_FALSE=
fi
as_fn_append MODULE_BLOCK "MODULE__TYPES_STATE=$py_cv_module__types$as_nl"
if test "x$py_cv_module__types" = xyes
then :
fi
@ -33723,6 +33747,10 @@ if test -z "${MODULE__STRUCT_TRUE}" && test -z "${MODULE__STRUCT_FALSE}"; then
as_fn_error $? "conditional \"MODULE__STRUCT\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TYPES_TRUE}" && test -z "${MODULE__TYPES_FALSE}"; then
as_fn_error $? "conditional \"MODULE__TYPES\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5
fi
if test -z "${MODULE__TYPING_TRUE}" && test -z "${MODULE__TYPING_FALSE}"; then
as_fn_error $? "conditional \"MODULE__TYPING\" was never defined.
Usually this means the macro was only invoked conditionally." "$LINENO" 5

View file

@ -7787,6 +7787,7 @@ PY_STDLIB_MOD_SIMPLE([_queue])
PY_STDLIB_MOD_SIMPLE([_random])
PY_STDLIB_MOD_SIMPLE([select])
PY_STDLIB_MOD_SIMPLE([_struct])
PY_STDLIB_MOD_SIMPLE([_types])
PY_STDLIB_MOD_SIMPLE([_typing])
PY_STDLIB_MOD_SIMPLE([_interpreters])
PY_STDLIB_MOD_SIMPLE([_interpchannels])