bpo-32320: Add default value support to collections.namedtuple() (#4859) · python/cpython@3948207 (original) (raw)
`@@ -216,6 +216,57 @@ def test_factory(self):
`
216
216
`self.assertRaises(TypeError, Point._make, [11]) # catch too few args
`
217
217
`self.assertRaises(TypeError, Point._make, [11, 22, 33]) # catch too many args
`
218
218
``
``
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
+
219
270
`@unittest.skipIf(sys.flags.optimize >= 2,
`
220
271
`"Docstrings are omitted with -O2 and above")
`
221
272
`def test_factory_doc_attr(self):
`