gh-145118: Add frozendict support to type() (#145124)

This commit is contained in:
Stan Ulbrych 2026-03-02 19:45:03 +00:00 committed by GitHub
parent 592e8f0865
commit f8d2f9fe67
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 30 additions and 5 deletions

View file

@ -2993,6 +2993,12 @@ def test_type_doc(self):
A.__doc__ = doc
self.assertEqual(A.__doc__, doc)
def test_type_frozendict(self):
A = type('A', (), frozendict({'x': 4, 'y': 2}))
self.assertEqual(A.x, 4)
self.assertEqual(A.y, 2)
self.assertEqual(A.__name__, 'A')
def test_bad_args(self):
with self.assertRaises(TypeError):
type()

View file

@ -0,0 +1 @@
:func:`type` now accepts :class:`frozendict` as an argument.

View file

@ -4872,9 +4872,21 @@ type_new_get_slots(type_new_ctx *ctx, PyObject *dict)
static PyTypeObject*
type_new_init(type_new_ctx *ctx)
{
PyObject *dict = PyDict_Copy(ctx->orig_dict);
if (dict == NULL) {
goto error;
PyObject *dict;
if (PyFrozenDict_Check(ctx->orig_dict)) {
dict = PyDict_New();
if (dict == NULL) {
goto error;
}
if (PyDict_Merge(dict, ctx->orig_dict, 1) < 0) {
goto error;
}
}
else {
dict = PyDict_Copy(ctx->orig_dict);
if (dict == NULL) {
goto error;
}
}
if (type_new_get_slots(ctx, dict) < 0) {
@ -5037,13 +5049,19 @@ type_new(PyTypeObject *metatype, PyObject *args, PyObject *kwds)
/* Parse arguments: (name, bases, dict) */
PyObject *name, *bases, *orig_dict;
if (!PyArg_ParseTuple(args, "UO!O!:type.__new__",
if (!PyArg_ParseTuple(args, "UO!O:type.__new__",
&name,
&PyTuple_Type, &bases,
&PyDict_Type, &orig_dict))
&orig_dict))
{
return NULL;
}
if (!PyAnyDict_Check(orig_dict)) {
PyErr_Format(PyExc_TypeError,
"type.__new__() argument 3 must be dict or frozendict, not %T",
orig_dict);
return NULL;
}
type_new_ctx ctx = {
.metatype = metatype,