@@ -216,6 +216,57 @@ def test_factory(self):
216216 self .assertRaises (TypeError , Point ._make , [11 ]) # catch too few args
217217 self .assertRaises (TypeError , Point ._make , [11 , 22 , 33 ]) # catch too many args
218218
219+ def test_defaults (self ):
220+ Point = namedtuple ('Point' , 'x y' , defaults = (10 , 20 )) # 2 defaults
221+ self .assertEqual (Point ._fields_defaults , {'x' : 10 , 'y' : 20 })
222+ self .assertEqual (Point (1 , 2 ), (1 , 2 ))
223+ self .assertEqual (Point (1 ), (1 , 20 ))
224+ self .assertEqual (Point (), (10 , 20 ))
225+
226+ Point = namedtuple ('Point' , 'x y' , defaults = (20 ,)) # 1 default
227+ self .assertEqual (Point ._fields_defaults , {'y' : 20 })
228+ self .assertEqual (Point (1 , 2 ), (1 , 2 ))
229+ self .assertEqual (Point (1 ), (1 , 20 ))
230+
231+ Point = namedtuple ('Point' , 'x y' , defaults = ()) # 0 defaults
232+ self .assertEqual (Point ._fields_defaults , {})
233+ self .assertEqual (Point (1 , 2 ), (1 , 2 ))
234+ with self .assertRaises (TypeError ):
235+ Point (1 )
236+
237+ with self .assertRaises (TypeError ): # catch too few args
238+ Point ()
239+ with self .assertRaises (TypeError ): # catch too many args
240+ Point (1 , 2 , 3 )
241+ with self .assertRaises (TypeError ): # too many defaults
242+ Point = namedtuple ('Point' , 'x y' , defaults = (10 , 20 , 30 ))
243+ with self .assertRaises (TypeError ): # non-iterable defaults
244+ Point = namedtuple ('Point' , 'x y' , defaults = 10 )
245+ with self .assertRaises (TypeError ): # another non-iterable default
246+ Point = namedtuple ('Point' , 'x y' , defaults = False )
247+
248+ Point = namedtuple ('Point' , 'x y' , defaults = None ) # default is None
249+ self .assertEqual (Point ._fields_defaults , {})
250+ self .assertIsNone (Point .__new__ .__defaults__ , None )
251+ self .assertEqual (Point (10 , 20 ), (10 , 20 ))
252+ with self .assertRaises (TypeError ): # catch too few args
253+ Point (10 )
254+
255+ Point = namedtuple ('Point' , 'x y' , defaults = [10 , 20 ]) # allow non-tuple iterable
256+ self .assertEqual (Point ._fields_defaults , {'x' : 10 , 'y' : 20 })
257+ self .assertEqual (Point .__new__ .__defaults__ , (10 , 20 ))
258+ self .assertEqual (Point (1 , 2 ), (1 , 2 ))
259+ self .assertEqual (Point (1 ), (1 , 20 ))
260+ self .assertEqual (Point (), (10 , 20 ))
261+
262+ Point = namedtuple ('Point' , 'x y' , defaults = iter ([10 , 20 ])) # allow plain iterator
263+ self .assertEqual (Point ._fields_defaults , {'x' : 10 , 'y' : 20 })
264+ self .assertEqual (Point .__new__ .__defaults__ , (10 , 20 ))
265+ self .assertEqual (Point (1 , 2 ), (1 , 2 ))
266+ self .assertEqual (Point (1 ), (1 , 20 ))
267+ self .assertEqual (Point (), (10 , 20 ))
268+
269+
219270 @unittest .skipIf (sys .flags .optimize >= 2 ,
220271 "Docstrings are omitted with -O2 and above" )
221272 def test_factory_doc_attr (self ):
0 commit comments