66verbose = test_support .verbose
77nerrors = 0
88
9+ def CmpToKey (mycmp ):
10+ 'Convert a cmp= function into a key= function'
11+ class K (object ):
12+ def __init__ (self , obj ):
13+ self .obj = obj
14+ def __lt__ (self , other ):
15+ return mycmp (self .obj , other .obj ) == - 1
16+ return K
17+
918def check (tag , expected , raw , compare = None ):
1019 global nerrors
1120
@@ -14,7 +23,7 @@ def check(tag, expected, raw, compare=None):
1423
1524 orig = raw [:] # save input in case of error
1625 if compare :
17- raw .sort (compare )
26+ raw .sort (key = CmpToKey ( compare ) )
1827 else :
1928 raw .sort ()
2029
@@ -99,7 +108,7 @@ def __repr__(self):
99108 print (" Checking against an insane comparison function." )
100109 print (" If the implementation isn't careful, this may segfault." )
101110 s = x [:]
102- s .sort (lambda a , b : int (random .random () * 3 ) - 1 )
111+ s .sort (key = CmpToKey ( lambda a , b : int (random .random () * 3 ) - 1 ) )
103112 check ("an insane function left some permutation" , x , s )
104113
105114 x = [Complains (i ) for i in x ]
@@ -141,14 +150,6 @@ def __lt__(self, other):
141150 L = [C () for i in range (50 )]
142151 self .assertRaises (ValueError , L .sort )
143152
144- def test_cmpNone (self ):
145- # Testing None as a comparison function.
146-
147- L = list (range (50 ))
148- random .shuffle (L )
149- L .sort (None )
150- self .assertEqual (L , list (range (50 )))
151-
152153 def test_undetected_mutation (self ):
153154 # Python 2.4a1 did not always detect mutation
154155 memorywaster = []
@@ -158,12 +159,12 @@ def mutating_cmp(x, y):
158159 L .pop ()
159160 return cmp (x , y )
160161 L = [1 ,2 ]
161- self .assertRaises (ValueError , L .sort , mutating_cmp )
162+ self .assertRaises (ValueError , L .sort , key = CmpToKey ( mutating_cmp ) )
162163 def mutating_cmp (x , y ):
163164 L .append (3 )
164165 del L [:]
165166 return cmp (x , y )
166- self .assertRaises (ValueError , L .sort , mutating_cmp )
167+ self .assertRaises (ValueError , L .sort , key = CmpToKey ( mutating_cmp ) )
167168 memorywaster = [memorywaster ]
168169
169170#==============================================================================
@@ -175,11 +176,11 @@ def test_decorated(self):
175176 copy = data [:]
176177 random .shuffle (data )
177178 data .sort (key = str .lower )
178- copy .sort (cmp = lambda x ,y : cmp (x .lower (), y .lower ()))
179+ copy .sort (key = CmpToKey ( lambda x ,y : cmp (x .lower (), y .lower () )))
179180
180181 def test_baddecorator (self ):
181182 data = 'The quick Brown fox Jumped over The lazy Dog' .split ()
182- self .assertRaises (TypeError , data .sort , None , lambda x ,y : 0 )
183+ self .assertRaises (TypeError , data .sort , key = lambda x ,y : 0 )
183184
184185 def test_stability (self ):
185186 data = [(random .randrange (100 ), i ) for i in range (200 )]
@@ -188,25 +189,11 @@ def test_stability(self):
188189 copy .sort () # sort using both fields
189190 self .assertEqual (data , copy ) # should get the same result
190191
191- def test_cmp_and_key_combination (self ):
192- # Verify that the wrapper has been removed
193- def compare (x , y ):
194- self .assertEqual (type (x ), str )
195- self .assertEqual (type (x ), str )
196- return cmp (x , y )
197- data = 'The quick Brown fox Jumped over The lazy Dog' .split ()
198- data .sort (cmp = compare , key = str .lower )
199-
200- def test_badcmp_with_key (self ):
201- # Verify that the wrapper has been removed
202- data = 'The quick Brown fox Jumped over The lazy Dog' .split ()
203- self .assertRaises (TypeError , data .sort , "bad" , str .lower )
204-
205192 def test_key_with_exception (self ):
206193 # Verify that the wrapper has been removed
207194 data = list (range (- 2 , 2 ))
208195 dup = data [:]
209- self .assertRaises (ZeroDivisionError , data .sort , None , lambda x : 1 / x )
196+ self .assertRaises (ZeroDivisionError , data .sort , key = lambda x : 1 / x )
210197 self .assertEqual (data , dup )
211198
212199 def test_key_with_mutation (self ):
@@ -254,14 +241,13 @@ def test_reverse(self):
254241 random .shuffle (data )
255242 data .sort (reverse = True )
256243 self .assertEqual (data , list (range (99 ,- 1 ,- 1 )))
257- self .assertRaises (TypeError , data .sort , "wrong type" )
258244
259245 def test_reverse_stability (self ):
260246 data = [(random .randrange (100 ), i ) for i in range (200 )]
261247 copy1 = data [:]
262248 copy2 = data [:]
263- data .sort (cmp = lambda x ,y : cmp (x [0 ],y [0 ]), reverse = True )
264- copy1 .sort (cmp = lambda x ,y : cmp (y [0 ],x [0 ]))
249+ data .sort (key = CmpToKey ( lambda x ,y : cmp (x [0 ],y [0 ]) ), reverse = True )
250+ copy1 .sort (key = CmpToKey ( lambda x ,y : cmp (y [0 ],x [0 ]) ))
265251 self .assertEqual (data , copy1 )
266252 copy2 .sort (key = lambda x : x [0 ], reverse = True )
267253 self .assertEqual (data , copy2 )
0 commit comments