NamedTuple เป็นคลาสในโมดูล collections คล้าย Dictionary ที่มี Key-Value แต่เข้าถึงได้ทั้ง Index, Attribute Name และ getattr() ลำดับฟิลด์คงที่
1. การเข้าถึงข้อมูล (Access Methods)
import collections as col
Employee = col.namedtuple('Employee', ['name', 'city', 'salary'])
e1 = Employee('Asim', 'Delhi', '25000')
e2 = Employee('Bibhas', 'Kolkata', '30000')
# 1. ด้วย Index
print(e1[0] + ' and ' + e1[2]) # Asim and 25000
# 2. ด้วย Attribute Name
print(e2.name + ' and ' + e2.salary) # Bibhas and 30000
# 3. ด้วย getattr()
print(getattr(e1, 'city') + ' and ' + getattr(e2, 'city')) # Delhi and Kolkata
2. การแปลงข้อมูล (Conversion)
_make(iterable)- แปลง List/Tuple -> NamedTuple**dict- แปลง Dict -> NamedTuple_asdict()- แปลง NamedTuple -> OrderedDict
# List -> NamedTuple
my_list = ['Asim', 'Delhi', '25000']
e1 = Employee._make(my_list)
# Dict -> NamedTuple
my_dict = {'name':'Bibhas', 'city':'Kolkata', 'salary':'30000'}
e2 = Employee(**my_dict)
# NamedTuple -> OrderedDict
emp_dict = e1._asdict()
# OrderedDict([('name', 'Asim'), ('city', 'Delhi'), ('salary', '25000')])
3. เมธอดเพิ่มเติม
_fields- คืน Tuple ของชื่อฟิลด์ทั้งหมด_replace(**kwargs)- สร้าง Instance ใหม่ด้วยค่าที่เปลี่ยน (Immutable)
e1 = Employee('Asim', 'Delhi', '25000')
print(e1._fields) # ('name', 'city', 'salary')
e1 = e1._replace(city='Mumbai')
# Employee(name='Asim', city='Mumbai', salary='25000')
ข้อดีของ NamedTuple
- อ่านโค้ดเข้าใจง่าย (Self-documenting)
- Immutable ปลอดภัย
- หน่วยความจำน้อยกว่า Class ปกติ
- รองรับ Type Hinting ได้ดี
เมื่อไหร่ควรใช้?
- ข้อมูลโครงสร้างเล็กๆ ที่ไม่ต้องแก้ไขบ่อย
- Return หลายค่าจากฟังก์ชัน
- Database Record, CSV Row, API Response