From 647bae6c520237b01d75e51adbc6048d95db30bc Mon Sep 17 00:00:00 2001
From: Guido van Rossum <guido@python.org>
Date: Fri, 4 Sep 2015 12:00:06 -0700
Subject: Issue #24635: Fixed flakiness in test_typing.py.

---
 Lib/test/test_typing.py | 17 ++++++++++++++---
 Lib/typing.py           | 15 ++++++++++-----
 Misc/NEWS               |  3 +++
 3 files changed, 27 insertions(+), 8 deletions(-)

diff --git a/Lib/test/test_typing.py b/Lib/test/test_typing.py
index b34007d..1461cfb 100644
--- a/Lib/test/test_typing.py
+++ b/Lib/test/test_typing.py
@@ -436,12 +436,14 @@ class CallableTests(TestCase):
             c()
 
     def test_callable_instance_works(self):
-        f = lambda: None
+        def f():
+            pass
         assert isinstance(f, Callable)
         assert not isinstance(None, Callable)
 
     def test_callable_instance_type_error(self):
-        f = lambda: None
+        def f():
+            pass
         with self.assertRaises(TypeError):
             assert isinstance(f, Callable[[], None])
         with self.assertRaises(TypeError):
@@ -674,7 +676,9 @@ class GenericTests(TestCase):
         T = TypeVar('T')
 
         class Node(Generic[T]):
-            def __init__(self, label: T, left: 'Node[T]' = None, right: 'Node[T]' = None):
+            def __init__(self, label: T,
+                         left: 'Node[T]' = None,
+                         right: 'Node[T]' = None):
                 self.label = label  # type: T
                 self.left = left  # type: Optional[Node[T]]
                 self.right = right  # type: Optional[Node[T]]
@@ -934,8 +938,15 @@ class CollectionsAbcTests(TestCase):
 
     def test_iterable(self):
         assert isinstance([], typing.Iterable)
+        # Due to ABC caching, the second time takes a separate code
+        # path and could fail.  So call this a few times.
+        assert isinstance([], typing.Iterable)
+        assert isinstance([], typing.Iterable)
         assert isinstance([], typing.Iterable[int])
         assert not isinstance(42, typing.Iterable)
+        # Just in case, also test issubclass() a few times.
+        assert issubclass(list, typing.Iterable)
+        assert issubclass(list, typing.Iterable)
 
     def test_iterator(self):
         it = iter([])
diff --git a/Lib/typing.py b/Lib/typing.py
index ddaec3e..1a4982e 100644
--- a/Lib/typing.py
+++ b/Lib/typing.py
@@ -1,7 +1,3 @@
-# TODO:
-# - Generic[T, T] is invalid
-# - Look for TODO below
-
 # TODO nits:
 # Get rid of asserts that are the caller's fault.
 # Docstrings (e.g. ABCs).
@@ -963,7 +959,8 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
                     raise TypeError("Initial parameters must be "
                                     "type variables; got %s" % p)
             if len(set(params)) != len(params):
-                raise TypeError("All type variables in Generic[...] must be distinct.")
+                raise TypeError(
+                    "All type variables in Generic[...] must be distinct.")
         else:
             if len(params) != len(self.__parameters__):
                 raise TypeError("Cannot change parameter count from %d to %d" %
@@ -987,6 +984,14 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
                               origin=self,
                               extra=self.__extra__)
 
+    def __instancecheck__(self, instance):
+        # Since we extend ABC.__subclasscheck__ and
+        # ABC.__instancecheck__ inlines the cache checking done by the
+        # latter, we must extend __instancecheck__ too. For simplicity
+        # we just skip the cache check -- instance checks for generic
+        # classes are supposed to be rare anyways.
+        return self.__subclasscheck__(instance.__class__)
+
     def __subclasscheck__(self, cls):
         if cls is Any:
             return True
diff --git a/Misc/NEWS b/Misc/NEWS
index 17b514a..ba82b67 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -88,6 +88,9 @@ Core and Builtins
 Library
 -------
 
+- Issue #24635: Fixed a bug in typing.py where isinstance([], typing.Iterable)
+  would return True once, then False on subsequent calls.
+
 - Issue #24989: Fixed buffer overread in BytesIO.readline() if a position is
   set beyond size.  Based on patch by John Leitch.
 
-- 
cgit v0.12

