4545from test import support
4646from itertools import repeat
4747from collections import deque
48- from builtins import len as _len
48+ from operator import length_hint
4949
5050n = 10
5151
52- def len (obj ):
53- try :
54- return _len (obj )
55- except TypeError :
56- try :
57- # note: this is an internal undocumented API,
58- # don't rely on it in your own programs
59- return obj .__length_hint__ ()
60- except AttributeError :
61- raise TypeError
6252
6353class TestInvariantWithoutMutations (unittest .TestCase ):
6454
6555 def test_invariant (self ):
6656 it = self .it
6757 for i in reversed (range (1 , n + 1 )):
68- self .assertEqual (len (it ), i )
58+ self .assertEqual (length_hint (it ), i )
6959 next (it )
70- self .assertEqual (len (it ), 0 )
60+ self .assertEqual (length_hint (it ), 0 )
7161 self .assertRaises (StopIteration , next , it )
72- self .assertEqual (len (it ), 0 )
62+ self .assertEqual (length_hint (it ), 0 )
7363
7464class TestTemporarilyImmutable (TestInvariantWithoutMutations ):
7565
@@ -78,12 +68,12 @@ def test_immutable_during_iteration(self):
7868 # length immutability during iteration
7969
8070 it = self .it
81- self .assertEqual (len (it ), n )
71+ self .assertEqual (length_hint (it ), n )
8272 next (it )
83- self .assertEqual (len (it ), n - 1 )
73+ self .assertEqual (length_hint (it ), n - 1 )
8474 self .mutate ()
8575 self .assertRaises (RuntimeError , next , it )
86- self .assertEqual (len (it ), 0 )
76+ self .assertEqual (length_hint (it ), 0 )
8777
8878## ------- Concrete Type Tests -------
8979
@@ -92,10 +82,6 @@ class TestRepeat(TestInvariantWithoutMutations):
9282 def setUp (self ):
9383 self .it = repeat (None , n )
9484
95- def test_no_len_for_infinite_repeat (self ):
96- # The repeat() object can also be infinite
97- self .assertRaises (TypeError , len , repeat (None ))
98-
9985class TestXrange (TestInvariantWithoutMutations ):
10086
10187 def setUp (self ):
@@ -167,14 +153,15 @@ def test_mutation(self):
167153 it = iter (d )
168154 next (it )
169155 next (it )
170- self .assertEqual (len (it ), n - 2 )
156+ self .assertEqual (length_hint (it ), n - 2 )
171157 d .append (n )
172- self .assertEqual (len (it ), n - 1 ) # grow with append
158+ self .assertEqual (length_hint (it ), n - 1 ) # grow with append
173159 d [1 :] = []
174- self .assertEqual (len (it ), 0 )
160+ self .assertEqual (length_hint (it ), 0 )
175161 self .assertEqual (list (it ), [])
176162 d .extend (range (20 ))
177- self .assertEqual (len (it ), 0 )
163+ self .assertEqual (length_hint (it ), 0 )
164+
178165
179166class TestListReversed (TestInvariantWithoutMutations ):
180167
@@ -186,32 +173,41 @@ def test_mutation(self):
186173 it = reversed (d )
187174 next (it )
188175 next (it )
189- self .assertEqual (len (it ), n - 2 )
176+ self .assertEqual (length_hint (it ), n - 2 )
190177 d .append (n )
191- self .assertEqual (len (it ), n - 2 ) # ignore append
178+ self .assertEqual (length_hint (it ), n - 2 ) # ignore append
192179 d [1 :] = []
193- self .assertEqual (len (it ), 0 )
180+ self .assertEqual (length_hint (it ), 0 )
194181 self .assertEqual (list (it ), []) # confirm invariant
195182 d .extend (range (20 ))
196- self .assertEqual (len (it ), 0 )
183+ self .assertEqual (length_hint (it ), 0 )
197184
198185## -- Check to make sure exceptions are not suppressed by __length_hint__()
199186
200187
201188class BadLen (object ):
202- def __iter__ (self ): return iter (range (10 ))
189+ def __iter__ (self ):
190+ return iter (range (10 ))
191+
203192 def __len__ (self ):
204193 raise RuntimeError ('hello' )
205194
195+
206196class BadLengthHint (object ):
207- def __iter__ (self ): return iter (range (10 ))
197+ def __iter__ (self ):
198+ return iter (range (10 ))
199+
208200 def __length_hint__ (self ):
209201 raise RuntimeError ('hello' )
210202
203+
211204class NoneLengthHint (object ):
212- def __iter__ (self ): return iter (range (10 ))
205+ def __iter__ (self ):
206+ return iter (range (10 ))
207+
213208 def __length_hint__ (self ):
214- return None
209+ return NotImplemented
210+
215211
216212class TestLengthHintExceptions (unittest .TestCase ):
217213
0 commit comments