Issue #24635: Fixed flakiness in test_typing.py. (Merge from 3.5.)

This commit is contained in:
Guido van Rossum 2015-09-04 12:05:03 -07:00
commit 82b63fadd2
3 changed files with 27 additions and 8 deletions

View File

@ -436,12 +436,14 @@ class CallableTests(TestCase):
c() c()
def test_callable_instance_works(self): def test_callable_instance_works(self):
f = lambda: None def f():
pass
assert isinstance(f, Callable) assert isinstance(f, Callable)
assert not isinstance(None, Callable) assert not isinstance(None, Callable)
def test_callable_instance_type_error(self): def test_callable_instance_type_error(self):
f = lambda: None def f():
pass
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
assert isinstance(f, Callable[[], None]) assert isinstance(f, Callable[[], None])
with self.assertRaises(TypeError): with self.assertRaises(TypeError):
@ -674,7 +676,9 @@ class GenericTests(TestCase):
T = TypeVar('T') T = TypeVar('T')
class Node(Generic[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.label = label # type: T
self.left = left # type: Optional[Node[T]] self.left = left # type: Optional[Node[T]]
self.right = right # type: Optional[Node[T]] self.right = right # type: Optional[Node[T]]
@ -933,9 +937,16 @@ class CollectionsAbcTests(TestCase):
assert not isinstance([], typing.Hashable) assert not isinstance([], typing.Hashable)
def test_iterable(self): 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)
assert isinstance([], typing.Iterable[int]) assert isinstance([], typing.Iterable[int])
assert not isinstance(42, typing.Iterable) 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): def test_iterator(self):
it = iter([]) it = iter([])

View File

@ -1,7 +1,3 @@
# TODO:
# - Generic[T, T] is invalid
# - Look for TODO below
# TODO nits: # TODO nits:
# Get rid of asserts that are the caller's fault. # Get rid of asserts that are the caller's fault.
# Docstrings (e.g. ABCs). # Docstrings (e.g. ABCs).
@ -963,7 +959,8 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
raise TypeError("Initial parameters must be " raise TypeError("Initial parameters must be "
"type variables; got %s" % p) "type variables; got %s" % p)
if len(set(params)) != len(params): 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: else:
if len(params) != len(self.__parameters__): if len(params) != len(self.__parameters__):
raise TypeError("Cannot change parameter count from %d to %d" % raise TypeError("Cannot change parameter count from %d to %d" %
@ -987,6 +984,14 @@ class GenericMeta(TypingMeta, abc.ABCMeta):
origin=self, origin=self,
extra=self.__extra__) 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): def __subclasscheck__(self, cls):
if cls is Any: if cls is Any:
return True return True

View File

@ -172,6 +172,9 @@ Core and Builtins
Library 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 - Issue #24989: Fixed buffer overread in BytesIO.readline() if a position is
set beyond size. Based on patch by John Leitch. set beyond size. Based on patch by John Leitch.