1.6Kпросмотров
8.0%от подписчиков
3 марта 2026 г.
Score: 1.7K
default_factory в dataclass: мощнее, чем кажется Многие используют dataclass как удобный способ задать структуру с полями. Но редко кто по-настоящему раскрывает силу default_factory. А зря — он спасает от багов и даёт гибкость. Когда нужно задать значение по умолчанию для поля в dataclass, логично тянуться к default=. Но если это изменяемый тип (например, список или словарь) — вас поджидает ловушка. from dataclasses import dataclass, field @dataclass
class User: name: str tags: list[str] = [] # ⚠️ опасно! Все экземпляры User будут делить один и тот же список. То есть: a = User("Alice")
b = User("Bob")
a.tags.append("admin") print(b.tags) # ['admin'] 😱 Вместо этого используйте default_factory: @dataclass
class User: name: str tags: list[str] = field(default_factory=list) Теперь у каждого User будет свой список: a = User("Alice")
b = User("Bob")
a.tags.append("admin") print(b.tags) # [] Но default_factory не только про списки. Это отличный способ задать любое значение "по умолчанию", включая кастомную логику: import uuid @dataclass
class Session: id: str = field(default_factory=lambda: str(uuid.uuid4())) Или, например, значения из окружения: import os @dataclass
class Config: debug: bool = field(default_factory=lambda: os.getenv("DEBUG") == "1") Кстати, это ещё и отличное место для внедрения DI: @dataclass
class Service: client: "Client" = field(default_factory=create_default_client) default_factory — это маленький хак, который позволяет сделать код чище и безопаснее, особенно когда работаешь с изменяемыми структурами или сложной инициализацией. 📲 Мы в MAX 👉@BookPython