Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

NamedTuple ใน Python: Tuple ที่เข้าถึงได้ทั้ง Index และชื่อ Key

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