DEV Community

Cover image for Python Trick: Using dataclasses with field(default_factory=...)
Developer Service
Developer Service

Posted on

Python Trick: Using dataclasses with field(default_factory=...)

Python's dataclasses module simplifies the creation of classes used for storing data.

While most people know about basic usage, there’s a less-known feature field(default_factory=...) that can be incredibly useful for handling default values in mutable types.


How It Works

When defining a dataclass, you might want to use a mutable default value, such as a list or a dictionary.

Using a mutable default directly can lead to unexpected behavior due to the way default arguments are shared across instances.

The default_factory function provides a clean way to handle mutable defaults.

Here’s a simple example:

from dataclasses import dataclass, field
from typing import List


@dataclass
class Student:
    name: str
    grades: List[int] = field(default_factory=list)  # Use default_factory for mutable default


# Create new Student instances
student1 = Student(name="Alice")
student2 = Student(name="Bob", grades=[90, 85])

# Modify student1's grades
student1.grades.append(95)

print(student1)  # Output: Student(name='Alice', grades=[95])
print(student2)  # Output: Student(name='Bob', grades=[90, 85])


# Output:
# Student(name='Alice', grades=[95])
# Student(name='Bob', grades=[90, 85])
Enter fullscreen mode Exit fullscreen mode

In this example, grades is initialized with an empty list for each new Student instance.
Using field(default_factory=list) ensures that each instance gets its own separate list, avoiding the pitfalls of shared mutable defaults.


Why It’s Cool

The default_factory feature is invaluable for avoiding common issues with mutable default arguments.

It helps ensure that each instance of a dataclass has its own default value, making your code more predictable and avoiding subtle bugs related to shared state.

Top comments (0)