feat: add support default_factory in AutoField

This commit is contained in:
rus07tam 2025-11-26 13:33:16 +00:00
parent 1e82a457ac
commit 420f7626fb

View file

@ -1,5 +1,7 @@
import pickle
from typing import Final, Generic, TypeVar
from typing import Callable, Final, Generic, TypeVar, overload
from typing_extensions import Self
from .field import Field
@ -9,8 +11,28 @@ T = TypeVar("T")
class AutoField(Field[T], Generic[T]):
__slots__ = ("__target_type",)
def __init__(self, default_value: T, *, target_type: type[T] | None = None) -> None:
super().__init__(default_value)
@overload
def __init__(
self, default_value: T, *, target_type: type[T] | None = None
) -> None: ...
@overload
def __init__(
self,
*,
default_factory: Callable[[Self], T],
target_type: type[T] | None = None,
) -> None: ...
def __init__(
self,
default_value: T | None = None,
*,
default_factory: Callable[[Self], T] | None = None,
target_type: type[T] | None = None,
) -> None:
if default_factory is not None and default_value is None:
super().__init__(default_factory=default_factory)
elif default_value is not None and default_factory is None:
super().__init__(default_value)
self.__target_type: Final = target_type
def serialize(self, value: T, /) -> bytes:
@ -19,5 +41,5 @@ class AutoField(Field[T], Generic[T]):
def deserialize(self, serialized: bytes, /) -> T:
value = pickle.loads(serialized)
if not isinstance(value, self.__target_type or object):
return self.default_value
return self._get_default()
return value # type: ignore