changeset: 97674:d1f41c614e62 branch: 3.5 parent: 97672:d562a421d6cd user: Guido van Rossum date: Fri Sep 04 12:00:06 2015 -0700 files: Lib/test/test_typing.py Lib/typing.py Misc/NEWS description: Issue #24635: Fixed flakiness in test_typing.py. diff -r d562a421d6cd -r d1f41c614e62 Lib/test/test_typing.py --- a/Lib/test/test_typing.py Fri Sep 04 17:29:57 2015 +0200 +++ b/Lib/test/test_typing.py Fri Sep 04 12:00:06 2015 -0700 @@ -436,12 +436,14 @@ 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 @@ 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 @@ 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 -r d562a421d6cd -r d1f41c614e62 Lib/typing.py --- a/Lib/typing.py Fri Sep 04 17:29:57 2015 +0200 +++ b/Lib/typing.py Fri Sep 04 12:00:06 2015 -0700 @@ -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 @@ 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 @@ 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 -r d562a421d6cd -r d1f41c614e62 Misc/NEWS --- a/Misc/NEWS Fri Sep 04 17:29:57 2015 +0200 +++ b/Misc/NEWS Fri Sep 04 12:00:06 2015 -0700 @@ -88,6 +88,9 @@ 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.