Source code for sqlatypemodel.util.dataclasses

"""Safe wrapper for Python dataclasses.

This module provides a wrapper around `dataclasses.dataclass` that ensures
compatibility with `MutableMixin` by enforcing safe defaults.
"""

from __future__ import annotations

import dataclasses
from collections.abc import Callable
from typing import TYPE_CHECKING, Any, TypeVar, overload

T = TypeVar("T")

if TYPE_CHECKING:
    dataclass = dataclasses.dataclass
else:

    @overload
    def dataclass(cls: type[T]) -> type[T]:
        ...

    @overload
    def dataclass(*args: Any, **kwargs: Any) -> Callable[[type[T]], type[T]]:
        ...

[docs] def dataclass(*args: Any, **kwargs: Any) -> Any: """Create a dataclass with safe defaults for mutation tracking. This wrapper enforces: - `eq=False`: Uses identity equality (`is`) instead of value equality. This prevents recursion loops during initialization and ensures correct behavior with `WeakKeyDictionary`. - `slots=False`: Allows `MutableMixin` to inject tracking attributes (like `_parents`) at runtime. Args: *args: Positional arguments passed to `dataclasses.dataclass`. **kwargs: Keyword arguments passed to `dataclasses.dataclass`. Returns: The decorated class. """ kwargs.setdefault("slots", False) kwargs.setdefault("eq", False) return dataclasses.dataclass(*args, **kwargs)