Apa itu Namedtuple
Di Python, namedtuple adalah alternatif yang nyaman dan hemat memori untuk kelas biasa ketika menangani struktur data sederhana. Mereka adalah bagian dari modul collections
dan menyediakan cara untuk membuat kelas yang didefinisikan pengguna dengan bidang bernama, memungkinkan kode yang lebih mudah dibaca dan mudah dipelihara. Namedtuple adalah subclass dari jenis tuple bawaan Python dan, sebagai hasilnya, mereka tidak dapat diubah, diurutkan, dan dapat di-iterasi.
Namedtuple sangat cocok untuk skenario di mana hanya sedikit data yang perlu di-strukturkan dan diakses dengan cara yang mudah dipahami. Mereka sering digunakan dalam aplikasi seperti parsing file CSV, bekerja dengan bentuk geometris, atau mewakili titik-titik dalam sistem koordinat.
Membuat Namedtuple
Untuk bekerja dengan namedtuples di Python, Anda perlu mengimpor fungsi namedtuple
dari modul collections
:
from collections import namedtuple
Untuk mendefinisikan sebuah namedtuple
, panggil fungsi namedtuple, melewatkan nama kelas yang diinginkan sebagai argumen pertama dan daftar nama bidang sebagai argumen kedua. Sebagai alternatif, nama bidang dapat diberikan sebagai string tunggal yang dipisahkan oleh spasi atau koma.
# Using a list of field names
Point = namedtuple('Point', ['x', 'y'])
# Using a string of field names
Point = namedtuple('Point', 'x y')
Setelah sebuah kelas namedtuple didefinisikan, Anda dapat membuat instance dengan memanggil kelas dan melewati nilai untuk setiap bidang sesuai dengan urutan yang telah didefinisikan.
point = Point(3, 4)
print(point) # Output: Point(x=3, y=4)
Metode dan Atribut Namedtuple
Namedtuple dilengkapi dengan beberapa metode dan atribut yang berguna untuk membuatnya lebih nyaman digunakan:
_fields
: Mengembalikan tuple yang berisi nama bidang dari namedtuple._asdict()
: Mengonversi namedtuple menjadi kamus berurutan._replace()
: Membuat instance namedtuple baru dengan beberapa bidang yang diganti._make()
: Membangun instance namedtuple dari objek yang dapat diiterasi.
Atribut _fields
dari kelas namedtuple menyediakan tuple yang berisi nama bidang yang didefinisikan dalam namedtuple. Ini dapat berguna untuk mengulang bidang atau ketika Anda perlu mengetahui nama bidang secara program.
Point = namedtuple('Point', 'x y')
print(Point._fields) # Output: ('x', 'y')
Metode _asdict()
mengonversi instance namedtuple menjadi kamus berurutan, di mana kunci adalah nama bidang dan nilai-nilainya adalah nilai-nilai bidang yang sesuai. Ini dapat membantu ketika Anda perlu meng-serialize atau meng-deserialize namedtuple, atau ketika bekerja dengan struktur data lain seperti JSON.
point = Point(3, 4)
point_dict = point._asdict()
print(point_dict) # Output: OrderedDict([('x', 3), ('y', 4)])
Metode _replace()
memungkink Anda untuk membuat instance namedtuple baru dengan beberapa bidang yang diganti dengan nilai baru. Ini sangat berguna karena namedtuples tidak dapat diubah, dan Anda tidak dapat mengubah nilainya secara langsung. Metode _replace()
menerima argumen kata kunci di mana kunci adalah nama bidang, dan nilai-nilainya adalah nilai-nilai baru untuk bidang-bidang tersebut.
point = Point(3, 4)
new_point = point._replace(x=5)
print(new_point) # Output: Point(x=5, y=4)
Metode _make()
adalah metode kelas yang membangun instance namedtuple dari objek yang dapat diiterasi, seperti daftar atau tuple. Ini dapat berguna ketika bekerja dengan data dari sumber eksternal, seperti file CSV atau database.
data = (6, 8)
point = Point._make(data)
print(point) # Output: Point(x=6, y=8)
Mengonversi Antara Namedtuple dan JSON
Namedtuple dapat dengan mudah dikonversi ke dan dari format JSON dengan menggunakan modul json
dengan kombinasi metode _asdict()
dan metode _make()
. Berikut adalah contohnya:
import json
# Convert namedtuple to JSON
point = Point(3, 4)
point_json = json.dumps(point._asdict())
print(point_json) # Output: {"x": 3, "y": 4}
# Convert JSON to namedtuple
json_data = '{"x": 6, "y": 8}'
data_dict = json.loads(json_data)
new_point = Point._make(data_dict.values())
print(new_point) # Output: Point(x=6, y=8)
Akses Dot
Namedtuple menyediakan akses titik ke bidang-bidangnya, yang membuat kode lebih mudah dipahami dan menjelaskan dibandingkan dengan menggunakan tuple atau kamus biasa. Dengan akses titik, Anda dapat mengakses nilai-nilai bidang namedtuple menggunakan nama bidang secara langsung, daripada bergantung pada indeks atau kunci.
Berikut adalah contoh yang menunjukkan akses titik dengan namedtuples:
from collections import namedtuple
# Defining a namedtuple
Employee = namedtuple('Employee', 'name age department salary')
# Creating an instance of the namedtuple
employee = Employee("John Doe", 35, "Engineering", 85000)
# Accessing fields using dot access
print(employee.name) # Output: John Doe
print(employee.age) # Output: 35
print(employee.department) # Output: Engineering
print(employee.salary) # Output: 85000
Seperti yang dapat Anda lihat, akses titik memungkinkan Anda mengakses bidang-bidang namedtuple secara individual menggunakan nama bidang, membuat kode lebih mudah dipahami dan dipelihara. Ini berbeda dengan menggunakan tuple atau kamus biasa, di mana Anda perlu menggunakan indeks atau kunci untuk mengakses nilai-nilai:
# Using a regular tuple
employee_tuple = ("John Doe", 35, "Engineering", 85000)
print(employee_tuple[0]) # Output: John Doe
# Using a dictionary
employee_dict = {"name": "John Doe", "age": 35, "department": "Engineering", "salary": 85000}
print(employee_dict["name"]) # Output: John Doe
Dalam contoh-contoh ini, menggunakan namedtuple dengan akses titik menyediakan cara yang lebih intuitif dan bersih untuk mengakses data.
Kasus Penggunaan Namedtuple
Namedtuple adalah struktur data yang serbaguna dan efisien dengan beberapa kasus penggunaan praktis dalam pemrograman Python. Berikut adalah beberapa skenario umum di mana namedtuples dapat sangat berguna:
Representasi Data
Namedtuple ideal untuk mewakili struktur data sederhana dengan beberapa atribut, seperti titik dalam ruang 2D atau 3D, warna dalam format RGB, atau interval tanggal.
from collections import namedtuple
Point = namedtuple('Point', 'x y z')
Color = namedtuple('Color', 'red green blue')
DateInterval = namedtuple('DateInterval', 'start end')
Membongkar File CSV
Namedtuple dapat digunakan untuk mewakili setiap baris data saat membongkar file CSV, membuat kode lebih mudah dibaca dan menjelaskan.
import csv
from collections import namedtuple
with open('data.csv', 'r') as file:
csv_reader = csv.reader(file)
headers = next(csv_reader)
Row = namedtuple('Row', headers)
for row in csv_reader:
row_data = Row._make(row)
print(row_data)
Membuat Bentuk Geometri
Namedtuple sangat cocok untuk mewakili bentuk geometri dan propertinya, seperti lingkaran, persegi panjang, atau segitiga.
from collections import namedtuple
Circle = namedtuple('Circle', 'center_x center_y radius')
Rectangle = namedtuple('Rectangle', 'left bottom width height')
Triangle = namedtuple('Triangle', 'point_a point_b point_c')
Hasil Kueri Database
Ketika mengambil data dari database, namedtuples dapat digunakan untuk mewakili setiap baris hasil, meningkatkan keterbacaan dan kemudahan pemeliharaan kode.
import sqlite3
from collections import namedtuple
conn = sqlite3.connect('example.db')
cursor = conn.cursor()
cursor.execute('SELECT * FROM users')
columns = [description[0] for description in cursor.description]
User = namedtuple('User', columns)
for row in cursor.fetchall():
user = User._make(row)
print(user)
Komunikasi Jaringan
Namedtuple dapat digunakan untuk mewakili paket data atau pesan yang ditukar antara simpul jaringan, sehingga memudahkan bekerja dengan jenis dan format pesan yang berbeda.
from collections import namedtuple
PacketHeader = namedtuple('PacketHeader', 'source destination packet_type')
Message = namedtuple('Message', 'header content')
Nilai Kembali Fungsi
Ketika sebuah fungsi perlu mengembalikan beberapa nilai, namedtuples dapat menyediakan cara yang bersih dan menjelaskan untuk mewakili nilai kembali, daripada bergantung pada tuple atau kamus.
from collections import namedtuple
def divide_and_remainder(a, b):
Result = namedtuple('Result', 'quotient remainder')
return Result(a // b, a % b)
result = divide_and_remainder(7, 3)
print(result) # Output: Result(quotient=2, remainder=1)
Referensi