Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions Doc/whatsnew/3.14.rst
Original file line number Diff line number Diff line change
Expand Up @@ -254,3 +254,5 @@ Deprecated
Removed
-------

* Creating :c:data:`immutable types <Py_TPFLAGS_IMMUTABLETYPE>` with mutable
bases was deprecated since 3.12 and now raises a :exc:`TypeError`.
22 changes: 3 additions & 19 deletions Lib/test/test_capi/test_misc.py
Original file line number Diff line number Diff line change
Expand Up @@ -777,33 +777,17 @@ def test_pytype_fromspec_with_repeated_slots(self):
with self.assertRaises(SystemError):
_testcapi.create_type_from_repeated_slots(variant)

@warnings_helper.ignore_warnings(category=DeprecationWarning)
def test_immutable_type_with_mutable_base(self):
# Add deprecation warning here so it's removed in 3.14
warnings._deprecated(
'creating immutable classes with mutable bases', remove=(3, 14))

class MutableBase:
def meth(self):
return 'original'

with self.assertWarns(DeprecationWarning):
ImmutableSubclass = _testcapi.make_immutable_type_with_base(
MutableBase)
instance = ImmutableSubclass()

self.assertEqual(instance.meth(), 'original')

# Cannot override the static type's method
with self.assertRaisesRegex(
TypeError,
"cannot set 'meth' attribute of immutable type"):
ImmutableSubclass.meth = lambda self: 'overridden'
self.assertEqual(instance.meth(), 'original')
with self.assertRaisesRegex(TypeError, 'Creating immutable type'):
_testcapi.make_immutable_type_with_base(MutableBase)

# Can change the method on the mutable base
MutableBase.meth = lambda self: 'changed'
self.assertEqual(instance.meth(), 'changed')
self.assertEqual(MutableBase().meth(), 'changed')
Comment thread
sobolevn marked this conversation as resolved.
Outdated

def test_pynumber_tobase(self):
from _testcapi import pynumber_tobase
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Creating :c:data:`immutable types <Py_TPFLAGS_IMMUTABLETYPE>` with mutable
bases was deprecated since 3.12 and now raises a :exc:`TypeError`.
15 changes: 6 additions & 9 deletions Objects/typeobject.c
Original file line number Diff line number Diff line change
Expand Up @@ -4613,16 +4613,13 @@ _PyType_FromMetaclass_impl(
goto finally;
}
if (!_PyType_HasFeature(b, Py_TPFLAGS_IMMUTABLETYPE)) {
if (PyErr_WarnFormat(
PyExc_DeprecationWarning,
0,
"Creating immutable type %s from mutable base %s is "
"deprecated, and slated to be disallowed in Python 3.14.",
PyErr_Format(
PyExc_TypeError,
"Creating immutable type %s from mutable base %s",
Comment thread
sobolevn marked this conversation as resolved.
Outdated
spec->name,
b->tp_name))
{
goto finally;
}
b->tp_name
);
goto finally;
}
}
}
Expand Down