gh-109599: Expose CapsuleType via the _types module (#131969)
This commit is contained in:
19
Lib/types.py
19
Lib/types.py
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
37
Modules/_typesmodule.c
Normal 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);
|
||||
}
|
||||
@@ -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},
|
||||
|
||||
|
||||
@@ -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" />
|
||||
|
||||
@@ -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>
|
||||
|
||||
1
Python/stdlib_module_names.h
generated
1
Python/stdlib_module_names.h
generated
@@ -94,6 +94,7 @@ static const char* _Py_stdlib_module_names[] = {
|
||||
"_tkinter",
|
||||
"_tokenize",
|
||||
"_tracemalloc",
|
||||
"_types",
|
||||
"_typing",
|
||||
"_uuid",
|
||||
"_warnings",
|
||||
|
||||
28
configure
generated
vendored
28
configure
generated
vendored
@@ -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
|
||||
|
||||
@@ -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])
|
||||
|
||||
Reference in New Issue
Block a user