@@ -746,11 +746,8 @@ def wrapper():
746746 self .assertEqual (wrapper .attr , 'This is a different test' )
747747 self .assertEqual (wrapper .dict_attr , f .dict_attr )
748748
749- @unittest .skipUnless (c_functools , 'requires the C _functools module' )
750- class TestReduce (unittest .TestCase ):
751- if c_functools :
752- func = c_functools .reduce
753749
750+ class TestReduce :
754751 def test_reduce (self ):
755752 class Squares :
756753 def __init__ (self , max ):
@@ -769,42 +766,42 @@ def __getitem__(self, i):
769766 return self .sofar [i ]
770767 def add (x , y ):
771768 return x + y
772- self .assertEqual (self .func (add , ['a' , 'b' , 'c' ], '' ), 'abc' )
769+ self .assertEqual (self .reduce (add , ['a' , 'b' , 'c' ], '' ), 'abc' )
773770 self .assertEqual (
774- self .func (add , [['a' , 'c' ], [], ['d' , 'w' ]], []),
771+ self .reduce (add , [['a' , 'c' ], [], ['d' , 'w' ]], []),
775772 ['a' ,'c' ,'d' ,'w' ]
776773 )
777- self .assertEqual (self .func (lambda x , y : x * y , range (2 ,8 ), 1 ), 5040 )
774+ self .assertEqual (self .reduce (lambda x , y : x * y , range (2 ,8 ), 1 ), 5040 )
778775 self .assertEqual (
779- self .func (lambda x , y : x * y , range (2 ,21 ), 1 ),
776+ self .reduce (lambda x , y : x * y , range (2 ,21 ), 1 ),
780777 2432902008176640000
781778 )
782- self .assertEqual (self .func (add , Squares (10 )), 285 )
783- self .assertEqual (self .func (add , Squares (10 ), 0 ), 285 )
784- self .assertEqual (self .func (add , Squares (0 ), 0 ), 0 )
785- self .assertRaises (TypeError , self .func )
786- self .assertRaises (TypeError , self .func , 42 , 42 )
787- self .assertRaises (TypeError , self .func , 42 , 42 , 42 )
788- self .assertEqual (self .func (42 , "1" ), "1" ) # func is never called with one item
789- self .assertEqual (self .func (42 , "" , "1" ), "1" ) # func is never called with one item
790- self .assertRaises (TypeError , self .func , 42 , (42 , 42 ))
791- self .assertRaises (TypeError , self .func , add , []) # arg 2 must not be empty sequence with no initial value
792- self .assertRaises (TypeError , self .func , add , "" )
793- self .assertRaises (TypeError , self .func , add , ())
794- self .assertRaises (TypeError , self .func , add , object ())
779+ self .assertEqual (self .reduce (add , Squares (10 )), 285 )
780+ self .assertEqual (self .reduce (add , Squares (10 ), 0 ), 285 )
781+ self .assertEqual (self .reduce (add , Squares (0 ), 0 ), 0 )
782+ self .assertRaises (TypeError , self .reduce )
783+ self .assertRaises (TypeError , self .reduce , 42 , 42 )
784+ self .assertRaises (TypeError , self .reduce , 42 , 42 , 42 )
785+ self .assertEqual (self .reduce (42 , "1" ), "1" ) # func is never called with one item
786+ self .assertEqual (self .reduce (42 , "" , "1" ), "1" ) # func is never called with one item
787+ self .assertRaises (TypeError , self .reduce , 42 , (42 , 42 ))
788+ self .assertRaises (TypeError , self .reduce , add , []) # arg 2 must not be empty sequence with no initial value
789+ self .assertRaises (TypeError , self .reduce , add , "" )
790+ self .assertRaises (TypeError , self .reduce , add , ())
791+ self .assertRaises (TypeError , self .reduce , add , object ())
795792
796793 class TestFailingIter :
797794 def __iter__ (self ):
798795 raise RuntimeError
799- self .assertRaises (RuntimeError , self .func , add , TestFailingIter ())
796+ self .assertRaises (RuntimeError , self .reduce , add , TestFailingIter ())
800797
801- self .assertEqual (self .func (add , [], None ), None )
802- self .assertEqual (self .func (add , [], 42 ), 42 )
798+ self .assertEqual (self .reduce (add , [], None ), None )
799+ self .assertEqual (self .reduce (add , [], 42 ), 42 )
803800
804801 class BadSeq :
805802 def __getitem__ (self , index ):
806803 raise ValueError
807- self .assertRaises (ValueError , self .func , 42 , BadSeq ())
804+ self .assertRaises (ValueError , self .reduce , 42 , BadSeq ())
808805
809806 # Test reduce()'s use of iterators.
810807 def test_iterator_usage (self ):
@@ -818,15 +815,25 @@ def __getitem__(self, i):
818815 raise IndexError
819816
820817 from operator import add
821- self .assertEqual (self .func (add , SequenceClass (5 )), 10 )
822- self .assertEqual (self .func (add , SequenceClass (5 ), 42 ), 52 )
823- self .assertRaises (TypeError , self .func , add , SequenceClass (0 ))
824- self .assertEqual (self .func (add , SequenceClass (0 ), 42 ), 42 )
825- self .assertEqual (self .func (add , SequenceClass (1 )), 0 )
826- self .assertEqual (self .func (add , SequenceClass (1 ), 42 ), 42 )
818+ self .assertEqual (self .reduce (add , SequenceClass (5 )), 10 )
819+ self .assertEqual (self .reduce (add , SequenceClass (5 ), 42 ), 52 )
820+ self .assertRaises (TypeError , self .reduce , add , SequenceClass (0 ))
821+ self .assertEqual (self .reduce (add , SequenceClass (0 ), 42 ), 42 )
822+ self .assertEqual (self .reduce (add , SequenceClass (1 )), 0 )
823+ self .assertEqual (self .reduce (add , SequenceClass (1 ), 42 ), 42 )
827824
828825 d = {"one" : 1 , "two" : 2 , "three" : 3 }
829- self .assertEqual (self .func (add , d ), "" .join (d .keys ()))
826+ self .assertEqual (self .reduce (add , d ), "" .join (d .keys ()))
827+
828+
829+ @unittest .skipUnless (c_functools , 'requires the C _functools module' )
830+ class TestReduceC (TestReduce , unittest .TestCase ):
831+ if c_functools :
832+ reduce = c_functools .reduce
833+
834+
835+ class TestReducePy (TestReduce , unittest .TestCase ):
836+ reduce = staticmethod (py_functools .reduce )
830837
831838
832839class TestCmpToKey :
0 commit comments