mirror of
https://github.com/python/cpython.git
synced 2026-04-13 15:20:52 +00:00
gh-145118: Add frozendict support to type() (#145124)
This commit is contained in:
parent
592e8f0865
commit
f8d2f9fe67
3 changed files with 30 additions and 5 deletions
|
|
@ -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()
|
||||
|
|
|
|||
|
|
@ -0,0 +1 @@
|
|||
:func:`type` now accepts :class:`frozendict` as an argument.
|
||||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue