for c in self.letters:
self.assertEqual(c in u, c in self.d or c in self.otherword)
self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(u), self.thetype)
+ self.assertEqual(type(u), self.basetype)
self.assertRaises(PassThru, self.s.union, check_pass_thru())
self.assertRaises(TypeError, self.s.union, [[]])
for C in set, frozenset, dict.fromkeys, str, list, tuple:
for c in self.letters:
self.assertEqual(c in i, c in self.d and c in self.otherword)
self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(i), self.thetype)
+ self.assertEqual(type(i), self.basetype)
self.assertRaises(PassThru, self.s.intersection, check_pass_thru())
for C in set, frozenset, dict.fromkeys, str, list, tuple:
self.assertEqual(self.thetype('abcba').intersection(C('cdc')), set('cc'))
for c in self.letters:
self.assertEqual(c in i, c in self.d and c not in self.otherword)
self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(i), self.thetype)
+ self.assertEqual(type(i), self.basetype)
self.assertRaises(PassThru, self.s.difference, check_pass_thru())
self.assertRaises(TypeError, self.s.difference, [[]])
for C in set, frozenset, dict.fromkeys, str, list, tuple:
for c in self.letters:
self.assertEqual(c in i, (c in self.d) ^ (c in self.otherword))
self.assertEqual(self.s, self.thetype(self.word))
- self.assertEqual(type(i), self.thetype)
+ self.assertEqual(type(i), self.basetype)
self.assertRaises(PassThru, self.s.symmetric_difference, check_pass_thru())
self.assertRaises(TypeError, self.s.symmetric_difference, [[]])
for C in set, frozenset, dict.fromkeys, str, list, tuple:
class TestSet(TestJointOps):
thetype = set
+ basetype = set
def test_init(self):
s = self.thetype()
dup = self.s.copy()
self.assertEqual(self.s, dup)
self.assertNotEqual(id(self.s), id(dup))
+ self.assertEqual(type(dup), self.basetype)
def test_add(self):
self.s.add('Q')
class TestSetSubclass(TestSet):
thetype = SetSubclass
+ basetype = set
class SetSubclassWithKeywordArgs(set):
def __init__(self, iterable=[], newarg=None):
class TestFrozenSet(TestJointOps):
thetype = frozenset
+ basetype = frozenset
def test_init(self):
s = self.thetype(self.word)
class TestFrozenSetSubclass(TestFrozenSet):
thetype = FrozenSetSubclass
+ basetype = frozenset
def test_constructor_identity(self):
s = self.thetype(range(3))
return (PyObject *)so;
}
+static PyObject *
+make_new_set_basetype(PyTypeObject *type, PyObject *iterable)
+{
+ if (type != &PySet_Type && type != &PyFrozenSet_Type) {
+ if (PyType_IsSubtype(type, &PySet_Type))
+ type = &PySet_Type;
+ else
+ type = &PyFrozenSet_Type;
+ }
+ return make_new_set(type, iterable);
+}
+
/* The empty frozenset is a singleton */
static PyObject *emptyfrozenset = NULL;
static PyObject *
set_copy(PySetObject *so)
{
- return make_new_set(Py_TYPE(so), (PyObject *)so);
+ return make_new_set_basetype(Py_TYPE(so), (PyObject *)so);
}
static PyObject *
if ((PyObject *)so == other)
return set_copy(so);
- result = (PySetObject *)make_new_set(Py_TYPE(so), NULL);
+ result = (PySetObject *)make_new_set_basetype(Py_TYPE(so), NULL);
if (result == NULL)
return NULL;
return NULL;
}
- result = make_new_set(Py_TYPE(so), NULL);
+ result = make_new_set_basetype(Py_TYPE(so), NULL);
if (result == NULL)
return NULL;
Py_INCREF(other);
otherset = (PySetObject *)other;
} else {
- otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
+ otherset = (PySetObject *)make_new_set_basetype(Py_TYPE(so), other);
if (otherset == NULL)
return NULL;
}
PyObject *rv;
PySetObject *otherset;
- otherset = (PySetObject *)make_new_set(Py_TYPE(so), other);
+ otherset = (PySetObject *)make_new_set_basetype(Py_TYPE(so), other);
if (otherset == NULL)
return NULL;
rv = set_symmetric_difference_update(otherset, (PyObject *)so);