Skip to content

Commit a7726f2

Browse files
committed
Use Py_TYPE(d) instead of cls_type to create the copy
1 parent 255b321 commit a7726f2

2 files changed

Lines changed: 12 additions & 18 deletions

File tree

Lib/test/test_dict.py

Lines changed: 11 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1944,32 +1944,32 @@ def __new__(self):
19441944

19451945
fd = FrozenDictSubclass.fromkeys("abc")
19461946
self.assertEqual(fd, frozendict(x=1, a=None, b=None, c=None))
1947-
self.assertEqual(type(fd), FrozenDictSubclass)
1947+
self.assertEqual(type(fd), frozendict)
19481948
self.assertEqual(created, frozendict(x=1))
19491949

19501950
fd = FrozenDictSubclass.fromkeys(frozendict(y=2))
19511951
self.assertEqual(fd, frozendict(x=1, y=None))
1952-
self.assertEqual(type(fd), FrozenDictSubclass)
1952+
self.assertEqual(type(fd), frozendict)
19531953
self.assertEqual(created, frozendict(x=1))
19541954

1955-
# Subclass which doesn't override the constructor
1956-
class FrozenDictSubclass2(frozendict):
1957-
pass
1958-
1959-
fd = FrozenDictSubclass2.fromkeys("abc")
1960-
self.assertEqual(fd, frozendict(a=None, b=None, c=None))
1961-
self.assertEqual(type(fd), FrozenDictSubclass2)
1962-
19631955
# Dict subclass which overrides the constructor
19641956
class DictSubclass(dict):
19651957
def __new__(self):
19661958
return created
19671959

19681960
fd = DictSubclass.fromkeys("abc")
19691961
self.assertEqual(fd, frozendict(x=1, a=None, b=None, c=None))
1970-
self.assertEqual(type(fd), DictSubclass)
1962+
self.assertEqual(type(fd), frozendict)
19711963
self.assertEqual(created, frozendict(x=1))
19721964

1965+
# Subclass which doesn't override the constructor
1966+
class FrozenDictSubclass2(frozendict):
1967+
pass
1968+
1969+
fd = FrozenDictSubclass2.fromkeys("abc")
1970+
self.assertEqual(fd, frozendict(a=None, b=None, c=None))
1971+
self.assertEqual(type(fd), FrozenDictSubclass2)
1972+
19731973
def test_pickle(self):
19741974
for proto in range(pickle.HIGHEST_PROTOCOL + 1):
19751975
for fd in (

Objects/dictobject.c

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3438,13 +3438,7 @@ _PyDict_FromKeys(PyObject *cls, PyObject *iterable, PyObject *value)
34383438
// the GC, create a frozendict copy which is not tracked by the GC.
34393439
if (PyFrozenDict_Check(d) && _PyObject_GC_IS_TRACKED(d)) {
34403440
// Subclass-friendly copy
3441-
PyObject *copy;
3442-
if (PyObject_IsSubclass(cls, (PyObject*)&PyFrozenDict_Type)) {
3443-
copy = frozendict_new_untracked(cls_type);
3444-
}
3445-
else {
3446-
copy = dict_new_untracked(cls_type);
3447-
}
3441+
PyObject *copy = frozendict_new_untracked(Py_TYPE(d));
34483442
if (copy == NULL) {
34493443
goto Fail;
34503444
}

0 commit comments

Comments
 (0)