Traffine I/O

Bahasa Indonesia

2023-03-31

Namedtuples di Python

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:

python
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.

python
# 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.

python
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.

python
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.

python
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.

python
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.

python
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:

python
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:

python
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:

python
# 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.

python
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.

python
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.

python
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.

python
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.

python
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.

python
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

https://dbader.org/blog/writing-clean-python-with-namedtuples
https://docs.python.org/3/library/collections.html#collections.namedtuple

Ryusei Kakujo

researchgatelinkedingithub

Focusing on data science for mobility

Bench Press 100kg!