Release/v0.6.0 #12
1 changed files with 26 additions and 4 deletions
|
|
@ -1,5 +1,7 @@
|
||||||
import pickle
|
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
|
from .field import Field
|
||||||
|
|
||||||
|
|
@ -9,8 +11,28 @@ T = TypeVar("T")
|
||||||
class AutoField(Field[T], Generic[T]):
|
class AutoField(Field[T], Generic[T]):
|
||||||
__slots__ = ("__target_type",)
|
__slots__ = ("__target_type",)
|
||||||
|
|
||||||
def __init__(self, default_value: T, *, target_type: type[T] | None = None) -> None:
|
@overload
|
||||||
super().__init__(default_value)
|
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
|
self.__target_type: Final = target_type
|
||||||
|
|
||||||
def serialize(self, value: T, /) -> bytes:
|
def serialize(self, value: T, /) -> bytes:
|
||||||
|
|
@ -19,5 +41,5 @@ class AutoField(Field[T], Generic[T]):
|
||||||
def deserialize(self, serialized: bytes, /) -> T:
|
def deserialize(self, serialized: bytes, /) -> T:
|
||||||
value = pickle.loads(serialized)
|
value = pickle.loads(serialized)
|
||||||
if not isinstance(value, self.__target_type or object):
|
if not isinstance(value, self.__target_type or object):
|
||||||
return self.default_value
|
return self._get_default()
|
||||||
return value # type: ignore
|
return value # type: ignore
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue