How to Use Structs in Python: dataclass and struct Module Explained

1. Why Are Structs Needed in Python?

Python is a high-level programming language and does not provide a direct “struct” feature like C. However, when you want to group multiple related pieces of data together, you may wish for a struct-like data structure. This is especially useful for efficient data handling in scenarios such as database management, file operations, or network communication.

Scenarios Where Structs Are Useful

In the following cases, a struct-like data management approach in Python is particularly helpful:
  • Managing large sets of related data: For example, when handling user information, product data, or any dataset with multiple properties.
  • File processing and network communication: Packing and unpacking binary data, or sending/receiving data in specific formats, can benefit from struct-like management.

2. Simulating Structs with Python dataclass

The dataclass module, introduced in Python 3.7, is a powerful tool that allows concise class definitions and struct-like data management. Compared to C structs, dataclass provides more flexible and Pythonic data handling.

Basic Usage and Example of dataclass

Using dataclass, you can define data structures simply, without writing boilerplate methods. Example:
from dataclasses import dataclass

@dataclass
class Book:
    title: str
    author: str
    price: float
Here, a Book data class is defined. Each field is automatically initialized through the __init__ method, making object creation straightforward.
book1 = Book("Python Basics", "Sato", 2800)
print(book1)  # Output: Book(title='Python Basics', author='Sato', price=2800)

Advanced Features of dataclass

You can also define default values for fields, making it easier to work with optional attributes.
@dataclass
class Product:
    name: str
    price: float = 0.0  # Default value
Thus, dataclass is a strong tool when you need struct-like simplicity, improving flexibility and readability.
年収訴求

3. Struct-Like Data Handling with Python struct Module

On the other hand, Python’s struct module provides functionality very close to C structs. It is especially effective for packing and unpacking binary data, useful in network communication and file processing.

Basic Usage of struct

The following example shows how to pack integers and floats into byte sequences and then unpack them:
import struct

# Pack integer and float into bytes
packed_data = struct.pack('if', 1024, 3.14)
print(packed_data)  # Output: b'x00x04x00x00xc3xf5H@'

# Unpack bytes
unpacked_data = struct.unpack('if', packed_data)
print(unpacked_data)  # Output: (1024, 3.140000104904175)
This demonstrates how to save data in binary format or convert it for transmission. The struct module uses format specifiers (e.g., i for integers, f for floats) to manage data efficiently.

Handling More Complex Data Types

struct can also handle multiple data types simultaneously. Example:
packed_data = struct.pack('i4sf', 1, b'test', 2.7)
print(packed_data)  # Output: b'x01x00x00x00testxcdxcc,@'

unpacked_data = struct.unpack('i4sf', packed_data)
print(unpacked_data)  # Output: (1, b'test', 2.700000047683716)
This makes struct an efficient tool specialized for binary data packing and unpacking.

4. When to Use dataclass vs struct

Both dataclass and struct serve different purposes in data management. Here’s when to use each:

Use dataclass when:

  • Lightweight data management: Ideal for managing struct-like data efficiently, such as user profiles in a web application.
  • Readability and flexibility: Best for projects where code clarity and fast development are priorities.

Use struct when:

  • Working with binary data: Perfect for network communication or binary file handling.
  • Maximizing memory efficiency: Useful for managing large amounts of data in compact byte form.
侍エンジニア塾

5. Practical Examples Using Structs

Example with dataclass: Product Data Management System

Here’s an example of using dataclass for product information in an e-commerce system:
from dataclasses import dataclass

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

# Create product data
product1 = Product("Laptop", 150000, 30)
product2 = Product("Smartphone", 80000, 50)

print(product1)  # Output: Product(name='Laptop', price=150000, stock=30)
This makes managing complex product data simple and adaptable for inventory systems.

Example with struct: Binary Data in Network Communication

struct is powerful for sending binary data in network communication:
import struct

# Pack data for sending (example server transmission)
data_to_send = struct.pack('i4sf', 42, b'data', 7.5)
print(data_to_send)  # Output: b'x2ax00x00x00datax00x00x00x00x00x00x00'

# Unpack received data
received_data = struct.unpack('i4sf', data_to_send)
print(received_data)  # Output: (42, b'data', 7.5)
This process packs an integer, a 4-byte string, and a float into bytes, then unpacks them on the receiving end, showing how efficiently struct handles compact data.

6. Conclusion

To achieve struct-like functionality in Python, you can use both dataclass and struct modules, depending on your needs:
  • dataclass: Simplifies lightweight data structure definitions, improving readability and maintainability. Ideal for application development and general data handling.
  • struct: Best for binary data operations, where memory efficiency and performance are critical, such as in networking or binary file processing.
By choosing the right tool for each situation, you can make Python data management more effective. Select based on the type of data and your specific processing goals to fully leverage Python’s power.
侍エンジニア塾