Pythonis struktuurid: kuidas kasutada dataclass ja struct andmete tõhusaks haldamiseks

1. Miks on struktuurid Pythonis vajalikud?

Python on kõrgema taseme programmeerimiskeel, millel ei ole otsest „struktuuri“ funktsiooni nagu C-keeles. Kuid olukordades, kus on vaja mitut seotud andmetükki koos hallata, võib tekkida vajadus C-keele struktuurile sarnase andmestruktuuri järele. Eriti oluline on see andmebaasiinfo haldamisel, failitöötluses või võrgusuhtluses, kus on vaja andmeid tõhusalt töödelda.

Olukorrad, kus struktuurid on vajalikud

Järgmistes stsenaariumides on Pythonis C-keele struktuuridele vastavad andmehaldusviisid eriti kasulikud:
  • Suurte seotud andmete haldamine: Näiteks kasutajainfo või tooteandmete haldamisel, kus igal andmekogumil on mitu omadust.
  • Failitöötlus ja võrgusuhtlus: Binaarandmete pakkimine ja lahtipakkimine või andmete edastamine kindlas formaadis on olukorrad, kus C-keele struktuuridele sarnane lähenemine on tõhus.

2. Struktuuri jäljendamine Pythonis dataclass abil

dataclass on Python 3.7 versioonis kasutusele võetud moodul, mis võimaldab määratleda keerukaid klasse lühidalt ning hallata struktuurile sarnaseid andmeid efektiivselt. See pakub paindlikku ja Pythonile omast andmehaldust võrreldes C-keele struktuuridega.

dataclassi põhikasutus ja näited

dataclass abil saab andmestruktuure lühidalt määratleda ilma käsitsi meetodeid kirjutamata. Näiteks:
from dataclasses import dataclass

@dataclass
class Book:
    title: str
    author: str
    price: float
Selles näites määratleme Book klassi. Iga väli initsialiseeritakse automaatselt __init__ meetodis ja objektide loomine muutub lihtsaks.
book1 = Book("Python入門", "佐藤", 2800)
print(book1)  # Väljund: Book(title='Python入門', author='佐藤', price=2800)

dataclassi täiendavad võimalused

dataclass võimaldab ka vaikeväärtuste määramist, mis teeb valikuliste väljade käsitlemise lihtsaks.
@dataclass
class Product:
    name: str
    price: float = 0.0  # vaikeväärtus
Nii on dataclass suurepärane vahend lihtsate struktuuride jaoks, parandades paindlikkust ja loetavust.
年収訴求

3. Struktuurilaadne andmetöötlus Pythonis struct mooduli abil

Pythonis olev struct moodul pakub C-keele struktuuridega väga sarnaseid võimalusi. See on eriti kasulik binaarandmete pakkimiseks ja lahtipakkimiseks, näiteks võrgusuhtluses või failitöötluses.

struct mooduli põhikasutus

Näide täisarvu ja ujukomaarvu pakkimisest baitide jadaks ja seejärel lahtipakkimisest:
import struct

# Täisarvu ja ujukomaarvu pakkimine
packed_data = struct.pack('if', 1024, 3.14)
print(packed_data)  # Väljund: b'x00x04x00x00xc3xf5H@'

# Lahtipakkimine
unpacked_data = struct.unpack('if', packed_data)
print(unpacked_data)  # Väljund: (1024, 3.140000104904175)

Keerukamate andmetüüpide töötlemine

struct võimaldab hallata ka mitut erinevat andmetüüpi korraga:
packed_data = struct.pack('i4sf', 1, b'test', 2.7)
print(packed_data)  # Väljund: b'x01x00x00x00testxcdxcc,@'

unpacked_data = struct.unpack('i4sf', packed_data)
print(unpacked_data)  # Väljund: (1, b'test', 2.700000047683716)

4. Millal kasutada dataclass ja millal struct?

Mõlemal vahendil on erinevad tugevused:

Millal kasutada dataclass

  • Kergekaaluline andmehaldus: sobib näiteks veebirakendustes kasutajainfo haldamiseks.
  • Loetavus ja paindlikkus: kiirendab arendust ja hoiab koodi selgena.

Millal kasutada struct

  • Binaarandmete töötlemisel: näiteks võrgusuhtlus või binaarfailid.
  • Mälu efektiivne kasutus: suurte andmehulkade tõhusaks haldamiseks.
侍エンジニア塾

5. Praktilised näited struktuuride kasutamisest

dataclass näide: tootehaldus

from dataclasses import dataclass

@dataclass
class Product:
    name: str
    price: float
    stock: int

product1 = Product("ノートPC", 150000, 30)
product2 = Product("スマートフォン", 80000, 50)

print(product1)  # Väljund: Product(name='ノートPC', price=150000, stock=30)

struct näide: binaarandmete edastus

import struct

data_to_send = struct.pack('i4sf', 42, b'data', 7.5)
print(data_to_send)

received_data = struct.unpack('i4sf', data_to_send)
print(received_data)  # Väljund: (42, b'data', 7.5)

6. Kokkuvõte

Pythonis saab struktuuride rolli täita dataclass ja struct abil:
  • dataclass: lihtne viis kergete andmestruktuuride määratlemiseks, parandab loetavust ja hooldatavust.
  • struct: ideaalne binaarandmete ja mälu tõhusa haldamise jaoks.
Valides õiged vahendid vastavalt andmetüübile ja eesmärgile, saab Pythonis andmeid hallata tõhusalt ja paindlikult.