https://github.com/python/cpython/commit/4978bfca1033358504c7a4ebbe33f0c28bededf7
commit: 4978bfca1033358504c7a4ebbe33f0c28bededf7
branch: main
author: Bénédikt Tran <[email protected]>
committer: picnixz <[email protected]>
date: 2025-09-11T09:56:20+02:00
summary:
gh-116946: add `Py_TPFLAGS_IMMUTABLETYPE` to several internal types (#138582)
The following types are now immutable:
* `_curses_panel.panel`,
* `[posix,nt].ScandirIterator`, `[posix,nt].DirEntry` (exposed in `os.py`),
* `_remote_debugging.RemoteUnwinder`,
* `_tkinter.Tcl_Obj`, `_tkinter.tkapp`, `_tkinter.tktimertoken`,
* `zlib.Compress`, and `zlib.Decompress`.
files:
A Misc/NEWS.d/next/Library/2025-09-06-14-47-23.gh-issue-116946.hj_u1t.rst
A Misc/NEWS.d/next/Library/2025-09-06-14-53-19.gh-issue-116946.c-npxd.rst
A Misc/NEWS.d/next/Library/2025-09-06-14-54-01.gh-issue-116946.hzQEWI.rst
A Misc/NEWS.d/next/Library/2025-09-06-14-56-40.gh-issue-116946.GGIeyO.rst
M Modules/_curses_panel.c
M Modules/_remote_debugging_module.c
M Modules/_tkinter.c
M Modules/posixmodule.c
M Modules/zlibmodule.c
diff --git
a/Misc/NEWS.d/next/Library/2025-09-06-14-47-23.gh-issue-116946.hj_u1t.rst
b/Misc/NEWS.d/next/Library/2025-09-06-14-47-23.gh-issue-116946.hj_u1t.rst
new file mode 100644
index 00000000000000..b078070166c26d
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-09-06-14-47-23.gh-issue-116946.hj_u1t.rst
@@ -0,0 +1,5 @@
+:mod:`tkinter`: the types :class:`!_tkinter.Tcl_Obj` (wrapper for Tcl objects),
+:class:`!_tkinter.tktimertoken` (obtained by calling ``createtimerhandler()``
+on a :attr:`Tk <tkinter.Tk.tk>` application) and :class:`!_tkinter.tkapp`
+(the runtime type of Tk applications) are now immutable.
+Patch by Bénédikt Tran.
diff --git
a/Misc/NEWS.d/next/Library/2025-09-06-14-53-19.gh-issue-116946.c-npxd.rst
b/Misc/NEWS.d/next/Library/2025-09-06-14-53-19.gh-issue-116946.c-npxd.rst
new file mode 100644
index 00000000000000..7d7d7ac5b289f3
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-09-06-14-53-19.gh-issue-116946.c-npxd.rst
@@ -0,0 +1,2 @@
+:mod:`os`: the :class:`os.DirEntry` type and the type of :func:`os.scandir`
+are now immutable. Patch by Bénédikt Tran.
diff --git
a/Misc/NEWS.d/next/Library/2025-09-06-14-54-01.gh-issue-116946.hzQEWI.rst
b/Misc/NEWS.d/next/Library/2025-09-06-14-54-01.gh-issue-116946.hzQEWI.rst
new file mode 100644
index 00000000000000..91c03fc740463f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-09-06-14-54-01.gh-issue-116946.hzQEWI.rst
@@ -0,0 +1,3 @@
+:mod:`zlib`: the types of :func:`zlib.compressobj`
+and :func:`zlib.decompressobj` are now immutable.
+Patch by Bénédikt Tran.
diff --git
a/Misc/NEWS.d/next/Library/2025-09-06-14-56-40.gh-issue-116946.GGIeyO.rst
b/Misc/NEWS.d/next/Library/2025-09-06-14-56-40.gh-issue-116946.GGIeyO.rst
new file mode 100644
index 00000000000000..90cf43b788137f
--- /dev/null
+++ b/Misc/NEWS.d/next/Library/2025-09-06-14-56-40.gh-issue-116946.GGIeyO.rst
@@ -0,0 +1,2 @@
+:mod:`curses.panel`: the type of :func:`curses.panel.new_panel` is now
+immutable. Patch by Bénédikt Tran.
diff --git a/Modules/_curses_panel.c b/Modules/_curses_panel.c
index 66a8c40953da8c..3b46fdf838b16f 100644
--- a/Modules/_curses_panel.c
+++ b/Modules/_curses_panel.c
@@ -684,6 +684,7 @@ static PyType_Spec PyCursesPanel_Type_spec = {
.flags = (
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
| Py_TPFLAGS_HAVE_GC
),
.slots = PyCursesPanel_Type_slots
diff --git a/Modules/_remote_debugging_module.c
b/Modules/_remote_debugging_module.c
index 827dcf4dcc4c14..c306143ee73b18 100644
--- a/Modules/_remote_debugging_module.c
+++ b/Modules/_remote_debugging_module.c
@@ -3062,7 +3062,10 @@ static PyType_Slot RemoteUnwinder_slots[] = {
static PyType_Spec RemoteUnwinder_spec = {
.name = "_remote_debugging.RemoteUnwinder",
.basicsize = sizeof(RemoteUnwinderObject),
- .flags = Py_TPFLAGS_DEFAULT,
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_IMMUTABLETYPE
+ ),
.slots = RemoteUnwinder_slots,
};
diff --git a/Modules/_tkinter.c b/Modules/_tkinter.c
index d921c46d645ac0..f0882191d3c3e8 100644
--- a/Modules/_tkinter.c
+++ b/Modules/_tkinter.c
@@ -906,11 +906,14 @@ static PyType_Slot PyTclObject_Type_slots[] = {
};
static PyType_Spec PyTclObject_Type_spec = {
- "_tkinter.Tcl_Obj",
- sizeof(PyTclObject),
- 0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
- PyTclObject_Type_slots,
+ .name = "_tkinter.Tcl_Obj",
+ .basicsize = sizeof(PyTclObject),
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
+ ),
+ .slots = PyTclObject_Type_slots,
};
@@ -3267,11 +3270,14 @@ static PyType_Slot Tktt_Type_slots[] = {
};
static PyType_Spec Tktt_Type_spec = {
- "_tkinter.tktimertoken",
- sizeof(TkttObject),
- 0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
- Tktt_Type_slots,
+ .name = "_tkinter.tktimertoken",
+ .basicsize = sizeof(TkttObject),
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
+ ),
+ .slots = Tktt_Type_slots,
};
@@ -3323,11 +3329,14 @@ static PyType_Slot Tkapp_Type_slots[] = {
static PyType_Spec Tkapp_Type_spec = {
- "_tkinter.tkapp",
- sizeof(TkappObject),
- 0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
- Tkapp_Type_slots,
+ .name = "_tkinter.tkapp",
+ .basicsize = sizeof(TkappObject),
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
+ ),
+ .slots = Tkapp_Type_slots,
};
static PyMethodDef moduleMethods[] =
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index 50d0ff1dc2127c..f229c4e8dd9322 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -16050,11 +16050,14 @@ static PyType_Slot DirEntryType_slots[] = {
};
static PyType_Spec DirEntryType_spec = {
- MODNAME ".DirEntry",
- sizeof(DirEntry),
- 0,
- Py_TPFLAGS_DEFAULT | Py_TPFLAGS_DISALLOW_INSTANTIATION,
- DirEntryType_slots
+ .name = MODNAME ".DirEntry",
+ .basicsize = sizeof(DirEntry),
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
+ ),
+ .slots = DirEntryType_slots
};
@@ -16492,14 +16495,17 @@ static PyType_Slot ScandirIteratorType_slots[] = {
};
static PyType_Spec ScandirIteratorType_spec = {
- MODNAME ".ScandirIterator",
- sizeof(ScandirIterator),
- 0,
+ .name = MODNAME ".ScandirIterator",
+ .basicsize = sizeof(ScandirIterator),
// bpo-40549: Py_TPFLAGS_BASETYPE should not be used, since
// PyType_GetModule(Py_TYPE(self)) doesn't work on a subclass instance.
- (Py_TPFLAGS_DEFAULT | Py_TPFLAGS_HAVE_FINALIZE
- | Py_TPFLAGS_DISALLOW_INSTANTIATION),
- ScandirIteratorType_slots
+ .flags = (
+ Py_TPFLAGS_DEFAULT
+ | Py_TPFLAGS_HAVE_FINALIZE
+ | Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
+ ),
+ .slots = ScandirIteratorType_slots
};
/*[clinic input]
diff --git a/Modules/zlibmodule.c b/Modules/zlibmodule.c
index 0625a6f8052b6c..1ee14e31612860 100644
--- a/Modules/zlibmodule.c
+++ b/Modules/zlibmodule.c
@@ -2043,6 +2043,7 @@ static PyType_Spec Comptype_spec = {
.flags = (
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
| Py_TPFLAGS_HAVE_GC
),
.slots= Comptype_slots,
@@ -2062,6 +2063,7 @@ static PyType_Spec Decomptype_spec = {
.flags = (
Py_TPFLAGS_DEFAULT
| Py_TPFLAGS_DISALLOW_INSTANTIATION
+ | Py_TPFLAGS_IMMUTABLETYPE
| Py_TPFLAGS_HAVE_GC
),
.slots = Decomptype_slots,
_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]