namedtuple – є підкласом звичайних кортежів Python (докладніше про tuple), котрий дає змогу звертатись до елементів кортежу за іменами, а не числовими індексами. namedtuple належать до модуля collections (огляд модуля), і забезпечують більш читабельний код, схожий на роботу з об’єктами звичайних класів.
Переваги namedtuple:
- Читабельність: доступ до елементів за наочними іменами, замість індексів.
- Незмінність: як і звичайні кортежі, namedtuple є незмінним.
- Економія пам’яті: namedtuple використовують менше пам’яті, у порівнянні з об’єктами звичайного класу.
Приклад роботи з namedtuple
Для створення namedtuple, модуль collections надає однойменну фабричну функцію. Приклад оголошення namedtuple:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])В цьому прикладі, виклик функції namedtuple() створює клас іменованого кортежу, з ім’ям Point і полями x та y.
Створення екземпляра класу іменованого кортежу Point:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
point = Point(10, 20)
print(type(point))
# <class '__main__.Point'>Щоб створити екземпляр Point, ми передаємо значення координат x та y конструктору Point, котрий в свою чергу повертає екземпляр іменованого кортежу.
Для доступу до елементів екземпляра іменованого кортежу, використовується крапкова нотація:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
point = Point(10, 20)
print(point.x) # 10
print(point.y) # 20Також для доступу до елементів, можна використовувати індекси (як в звичайному tuple), але крапкова нотація є більш явною та читабельною. Під час використання індексів, доводиться шукати і підраховувати позиції, щоб отримати відповідний індекс для шуканого значення. Крапкова нотація зменшує ризик помилки (вихід за межі контейнера, доступ до невідповідного елемента, тощо).
Додаткові методи namedtuple
_make(iterable) – створює новий екземпляр іменованого кортежу, на основі існуючого об’єкта послідовності:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y', 'z'])
data = [10, 20, 30]
point = Point._make(data)
print(point)
# Point(x=10, y=20, z=30)_replace(**kwargs) – створює новий екземпляр іменованого кортежу, на основі вже існуючого, при цьому замінюючи вказані поля новими значеннями:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
point = Point(10, 20)
print(point) # Point(x=10, y=20)
new_point = point._replace(y=300)
print(new_point) # Point(x=10, y=300)_asdict() – повертає новий словник, створений на основі namedtuple:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
point = Point(10, 20)
point_dict = point._asdict()
print(type(point_dict)) # <class 'dict'>
print(point_dict) # {'x': 10, 'y': 20}_fields – повертає кортеж рядків, що містить імена полів namedtuple:
from collections import namedtuple
Point = namedtuple('Point', ['x', 'y'])
point = Point(10, 20)
print(point._fields) # ('x', 'y')Підсумок
Іменовані кортежі є зручним інструментом Python для створення структурованих іменованих даних, що підвищує читабельність. namedtuple може бути корисним, коли потрібно зберегти набір значень доступних за іменами, без необхідності створювати клас (наприклад представлення координат точки, або інших даних у певному форматі – адреса, контактна інформація, тощо).