Merged revisions 78800 via svnmerge from
svn+ssh://pythondev@svn.python.org/python/trunk
........
r78800 | florent.xicluna | 2010-03-08 16:20:28 +0100 (lun, 08 mar 2010) | 2 lines
#7624: Fix isinstance(foo(), collections.Callable) for old-style classes.
........
diff --git a/Lib/test/test_collections.py b/Lib/test/test_collections.py
index 4a068e0..d1fd60e 100644
--- a/Lib/test/test_collections.py
+++ b/Lib/test/test_collections.py
@@ -210,6 +210,27 @@
C = type('C', (abc,), stubs)
self.assertRaises(TypeError, C, name)
+ def validate_isinstance(self, abc, name):
+ stub = lambda s, *args: 0
+
+ # new-style class
+ C = type('C', (object,), {name: stub})
+ self.assertTrue(isinstance(C(), abc))
+ self.assertTrue(issubclass(C, abc))
+ # old-style class
+ class C: pass
+ setattr(C, name, stub)
+ self.assertTrue(isinstance(C(), abc))
+ self.assertTrue(issubclass(C, abc))
+
+ # new-style class
+ C = type('C', (object,), {'__hash__': None})
+ self.assertFalse(isinstance(C(), abc))
+ self.assertFalse(issubclass(C, abc))
+ # old-style class
+ class C: pass
+ self.assertFalse(isinstance(C(), abc))
+ self.assertFalse(issubclass(C, abc))
class TestOneTrickPonyABCs(ABCTestCase):
@@ -238,6 +259,7 @@
self.assertEqual(hash(H()), 0)
self.failIf(issubclass(int, H))
self.validate_abstract_methods(Hashable, '__hash__')
+ self.validate_isinstance(Hashable, '__hash__')
def test_Iterable(self):
# Check some non-iterables
@@ -262,6 +284,7 @@
self.assertEqual(list(I()), [])
self.failIf(issubclass(str, I))
self.validate_abstract_methods(Iterable, '__iter__')
+ self.validate_isinstance(Iterable, '__iter__')
def test_Iterator(self):
non_samples = [None, 42, 3.14, 1j, "".encode('ascii'), "", (), [],
@@ -281,6 +304,7 @@
self.failUnless(isinstance(x, Iterator), repr(x))
self.failUnless(issubclass(type(x), Iterator), repr(type(x)))
self.validate_abstract_methods(Iterator, 'next')
+ self.validate_isinstance(Iterator, 'next')
def test_Sized(self):
non_samples = [None, 42, 3.14, 1j,
@@ -298,6 +322,7 @@
self.failUnless(isinstance(x, Sized), repr(x))
self.failUnless(issubclass(type(x), Sized), repr(type(x)))
self.validate_abstract_methods(Sized, '__len__')
+ self.validate_isinstance(Sized, '__len__')
def test_Container(self):
non_samples = [None, 42, 3.14, 1j,
@@ -315,6 +340,7 @@
self.failUnless(isinstance(x, Container), repr(x))
self.failUnless(issubclass(type(x), Container), repr(type(x)))
self.validate_abstract_methods(Container, '__contains__')
+ self.validate_isinstance(Container, '__contains__')
def test_Callable(self):
non_samples = [None, 42, 3.14, 1j,
@@ -334,6 +360,7 @@
self.failUnless(isinstance(x, Callable), repr(x))
self.failUnless(issubclass(type(x), Callable), repr(type(x)))
self.validate_abstract_methods(Callable, '__call__')
+ self.validate_isinstance(Callable, '__call__')
def test_direct_subclassing(self):
for B in Hashable, Iterable, Iterator, Sized, Container, Callable:
@@ -475,7 +502,7 @@
self.validate_abstract_methods(MutableSequence, '__contains__', '__iter__',
'__len__', '__getitem__', '__setitem__', '__delitem__', 'insert')
-import doctest, collections
+import collections
def test_main(verbose=None):
NamedTupleDocs = doctest.DocTestSuite(module=collections)