Modifying & Extending Named Tuples in Python

Named tuple returns instance of tuple class and tuples are immutable. But, while programming, we often require to modify item and add new item by extending existing tuples.

This article explains how to modify and extend existing named tuples using _replace() and _fields.

Consider we have following named tuples for 2D point:


from collections import namedtuple

Point2D = namedtuple('Point2D', 'x y')

pt = Point2D(10,20)

print("Point is: ", pt)

Output

Point is:  Point2D(x=10, y=20)

Since namedtuple returns instance of standard tuple, its value can not be changed like:


from collections import namedtuple

Point2D = namedtuple('Point2D', 'x y')

pt = Point2D(10,20)

pt.x = 100

Output

AttributeError: can't set attribute

So, to modify and extend existing named tuples we use _replace() and _fields() method. Remember these methods create another instance of namedtuple by modifying the existing one.

Modifying namedtuple Using _replace

Handy method to modify the existing value of some properties in namedtuple is _replace. See example below:


from collections import namedtuple

Point2D = namedtuple('Point2D', 'x y')

pt = Point2D(x=10,y=20)

pt = pt._replace(x=100)

print("Modified point is: ", pt)

Output

Modified point is:  Point2D(x=100, y=20)

Extending namedtuple Using _fields

Suppose we want to extend existing Point2D having co-ordinates x, y to Point3D having co-ordinates x, y, z then we can use _fields method as follow:


from collections import namedtuple

Point2D = namedtuple('Point2D', 'x y')

pt = Point2D(x=10, y=20)

# extending namedtuple
Point3D = namedtuple('Point3D', Point2D._fields + ('z', ))

# extending existing point
pt = Point3D(*pt, z=500)

# result
print("Point3D details: ", Point3D._fields)
print("Extended point: ", pt)

Output

Point3D details:  ('x', 'y', 'z')
Extended point:  Point3D(x=10, y=20, z=500)