There was an error while loading. Please reload this page.
1 parent fe800a3 commit 54628faCopy full SHA for 54628fa
2 files changed
Lib/test/test_defaultdict.py
@@ -60,6 +60,7 @@ def test_repr(self):
60
d1 = defaultdict()
61
self.assertEqual(d1.default_factory, None)
62
self.assertEqual(repr(d1), "defaultdict(None, {})")
63
+ self.assertEqual(eval(repr(d1)), d1)
64
d1[11] = 41
65
self.assertEqual(repr(d1), "defaultdict(None, {11: 41})")
66
d2 = defaultdict(int)
@@ -112,6 +113,12 @@ def test_copy(self):
112
113
d4[12]
114
self.assertEqual(d4, {42: [], 12: []})
115
116
+ # Issue 6637: Copy fails for empty default dict
117
+ d = defaultdict()
118
+ d['a'] = 42
119
+ e = d.copy()
120
+ self.assertEqual(e['a'], 42)
121
+
122
def test_shallow_copy(self):
123
d1 = defaultdict(foobar, {1: 1})
124
d2 = copy.copy(d1)
Modules/_collectionsmodule.c
@@ -1170,6 +1170,9 @@ defdict_copy(defdictobject *dd)
1170
whose class constructor has the same signature. Subclasses that
1171
define a different constructor signature must override copy().
1172
*/
1173
1174
+ if (dd->default_factory == NULL)
1175
+ return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd), Py_None, dd, NULL);
1176
return PyObject_CallFunctionObjArgs((PyObject*)Py_TYPE(dd),
1177
dd->default_factory, dd, NULL);
1178
}
@@ -1316,7 +1319,7 @@ defdict_init(PyObject *self, PyObject *args, PyObject *kwds)
1316
1319
Py_ssize_t n = PyTuple_GET_SIZE(args);
1317
1320
if (n > 0) {
1318
1321
newdefault = PyTuple_GET_ITEM(args, 0);
- if (!PyCallable_Check(newdefault)) {
1322
+ if (!PyCallable_Check(newdefault) && newdefault != Py_None) {
1323
PyErr_SetString(PyExc_TypeError,
1324
"first argument must be callable");
1325
return -1;
0 commit comments