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):

`