From 81555b81be78b0763e1e62fc0c08ab6a1c246bfa Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 09:56:13 +0100 Subject: [PATCH 1/9] Cache ``types.CapsuleType`` on first compution --- Lib/types.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Lib/types.py b/Lib/types.py index 1484c22ee9dffa..7b9434ebae35bd 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -333,8 +333,10 @@ def wrapped(*args, **kwargs): def __getattr__(name): if name == 'CapsuleType': + global CapsuleType import _socket - return type(_socket.CAPI) + CapsuleType = type(_socket.CAPI) + return CapsuleType raise AttributeError(f"module {__name__!r} has no attribute {name!r}") __all__ = [n for n in globals() if n[:1] != '_'] From f2a25309a54e9992242c54e3a0afa489d9b829af Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:51:37 +0100 Subject: [PATCH 2/9] Add a _types module exposing `CapsuleType` and `SimpleNamespace` --- Modules/Setup | 1 + Modules/Setup.bootstrap.in | 1 + Modules/_typesmodule.c | 37 ++++++++++++++++++++++++++++++ PC/config.c | 2 ++ PCbuild/pythoncore.vcxproj | 1 + PCbuild/pythoncore.vcxproj.filters | 3 +++ Python/stdlib_module_names.h | 1 + configure.ac | 1 + 8 files changed, 47 insertions(+) create mode 100644 Modules/_typesmodule.c diff --git a/Modules/Setup b/Modules/Setup index ddf39e0b966610..d050d7a5fc2dc3 100644 --- a/Modules/Setup +++ b/Modules/Setup @@ -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 diff --git a/Modules/Setup.bootstrap.in b/Modules/Setup.bootstrap.in index 4dcc0f55176d0e..2b2e8cb3e3cacd 100644 --- a/Modules/Setup.bootstrap.in +++ b/Modules/Setup.bootstrap.in @@ -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 diff --git a/Modules/_typesmodule.c b/Modules/_typesmodule.c new file mode 100644 index 00000000000000..f2e925a69dca1d --- /dev/null +++ b/Modules/_typesmodule.c @@ -0,0 +1,37 @@ +/* _types module */ + +#include "Python.h" +#include "internal/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); +} diff --git a/PC/config.c b/PC/config.c index 873f93063057dc..c1a314a7454f81 100644 --- a/PC/config.c +++ b/PC/config.c @@ -23,6 +23,7 @@ extern PyObject* PyInit__sha2(void); extern PyObject* PyInit__sha3(void); extern PyObject* PyInit__statistics(void); extern PyObject* PyInit__sysconfig(void); +extern PyObject* PyInit__types(void); extern PyObject* PyInit__typing(void); extern PyObject* PyInit__blake2(void); extern PyObject* PyInit_time(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}, #ifdef WIN32 diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 2e639ddfc320f5..3e9dbcbedbc19c 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -481,6 +481,7 @@ + diff --git a/PCbuild/pythoncore.vcxproj.filters b/PCbuild/pythoncore.vcxproj.filters index 31064f50f5c8d7..acbfbd7533c506 100644 --- a/PCbuild/pythoncore.vcxproj.filters +++ b/PCbuild/pythoncore.vcxproj.filters @@ -992,6 +992,9 @@ Modules + + Modules + Modules diff --git a/Python/stdlib_module_names.h b/Python/stdlib_module_names.h index 584b050fc4bb6e..0e5834ebdb233d 100644 --- a/Python/stdlib_module_names.h +++ b/Python/stdlib_module_names.h @@ -92,6 +92,7 @@ static const char* _Py_stdlib_module_names[] = { "_tkinter", "_tokenize", "_tracemalloc", +"_types", "_typing", "_uuid", "_warnings", diff --git a/configure.ac b/configure.ac index 23bd81ed4431b9..b0a8fb368e3ea2 100644 --- a/configure.ac +++ b/configure.ac @@ -7767,6 +7767,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]) From 50c51732f140d30d015e6772a4c83d6f29b5029e Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 12:52:06 +0100 Subject: [PATCH 3/9] Use the `_types` module in `types` --- Lib/types.py | 21 +++++++-------------- 1 file changed, 7 insertions(+), 14 deletions(-) diff --git a/Lib/types.py b/Lib/types.py index 7b9434ebae35bd..26b58e8384c366 100644 --- a/Lib/types.py +++ b/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 @@ def _f(): pass 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 @@ def _m(self): pass MethodDescriptorType = type(str.join) ClassMethodDescriptorType = type(dict.__dict__['fromkeys']) -ModuleType = type(sys) +ModuleType = type(_types) try: raise TypeError @@ -60,7 +60,9 @@ def _m(self): pass 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,13 +333,4 @@ def wrapped(*args, **kwargs): NoneType = type(None) NotImplementedType = type(NotImplemented) -def __getattr__(name): - if name == 'CapsuleType': - global CapsuleType - import _socket - CapsuleType = type(_socket.CAPI) - return CapsuleType - 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('_')] From 84684499115d1adc18e279a7e46ccea4d25215e0 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:02:18 +0100 Subject: [PATCH 4/9] Apply configure changes --- configure | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/configure b/configure index a058553480ca5a..7f23fac856c451 100755 --- a/configure +++ b/configure @@ -781,6 +781,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 @@ -30975,6 +30977,27 @@ 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 @@ -33650,6 +33673,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 From 816b4af66eb7e896236541f857af9ffd6162b4a7 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:12:50 +0100 Subject: [PATCH 5/9] fixup! Apply configure changes --- configure | 1 + 1 file changed, 1 insertion(+) diff --git a/configure b/configure index 7f23fac856c451..ff08b7ebf3a9e1 100755 --- a/configure +++ b/configure @@ -30999,6 +30999,7 @@ then : + fi From d97b1227ea96239f5e2ec1741a86952586ddb9c2 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:38:26 +0100 Subject: [PATCH 6/9] fixup! Apply configure changes --- configure | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/configure b/configure index ff08b7ebf3a9e1..c6016470637012 100755 --- a/configure +++ b/configure @@ -30977,6 +30977,7 @@ then : + fi @@ -30999,7 +31000,6 @@ then : - fi From 04d9b4e463a75f10fb150859544133822b9d2d2a Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 15:48:06 +0100 Subject: [PATCH 7/9] Remove `internal/` prefix --- Modules/_typesmodule.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Modules/_typesmodule.c b/Modules/_typesmodule.c index f2e925a69dca1d..aabb35f47eefc3 100644 --- a/Modules/_typesmodule.c +++ b/Modules/_typesmodule.c @@ -1,7 +1,7 @@ /* _types module */ #include "Python.h" -#include "internal/pycore_namespace.h" // _PyNamespace_Type +#include "pycore_namespace.h" // _PyNamespace_Type static int _types_exec(PyObject *m) From 9c508ae1be58bdfb119fee90a5ad243b46085c09 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 16:30:18 +0100 Subject: [PATCH 8/9] Remove ``types.__all__`` `from types import *` will ignore underscore-prefixed names by default, so defining `__all__` doesn't add anything. --- Lib/types.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/Lib/types.py b/Lib/types.py index 26b58e8384c366..a0ad90b8d3272a 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -332,5 +332,3 @@ def wrapped(*args, **kwargs): EllipsisType = type(Ellipsis) NoneType = type(None) NotImplementedType = type(NotImplemented) - -__all__ = [n for n in globals() if not n.startswith('_')] From b7f5df13f541c135b166eec4cf1ff19fd2c39613 Mon Sep 17 00:00:00 2001 From: Adam Turner <9087854+aa-turner@users.noreply.github.com> Date: Tue, 1 Apr 2025 17:19:46 +0100 Subject: [PATCH 9/9] Reinstate __all__ for pydoc --- Lib/types.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Lib/types.py b/Lib/types.py index a0ad90b8d3272a..9aa0a3b087c1c7 100644 --- a/Lib/types.py +++ b/Lib/types.py @@ -332,3 +332,5 @@ def wrapped(*args, **kwargs): EllipsisType = type(Ellipsis) NoneType = type(None) NotImplementedType = type(NotImplemented) + +__all__ = [n for n in globals() if not n.startswith('_')] # for pydoc pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy