refactor: add Unset annotation
This commit is contained in:
parent
fee08f3609
commit
2149fcf308
2 changed files with 30 additions and 22 deletions
|
|
@ -3,6 +3,8 @@ from typing import Callable, Final, Generic, TypeVar, overload
|
||||||
|
|
||||||
from typing_extensions import Self
|
from typing_extensions import Self
|
||||||
|
|
||||||
|
from snakia.types import Unset
|
||||||
|
|
||||||
from .field import Field
|
from .field import Field
|
||||||
|
|
||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
|
@ -13,33 +15,38 @@ class AutoField(Field[T], Generic[T]):
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __init__(
|
def __init__(
|
||||||
self, default_value: T, *, target_type: type[T] | None = None
|
self, default_value: T, *, target_type: type[T] | Unset = Unset()
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
|
|
||||||
@overload
|
@overload
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
*,
|
*,
|
||||||
default_factory: Callable[[Self], T],
|
default_factory: Callable[[Self], T],
|
||||||
target_type: type[T] | None = None,
|
target_type: type[T] | Unset = Unset(),
|
||||||
) -> None: ...
|
) -> None: ...
|
||||||
|
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
default_value: T | None = None,
|
default_value: T | Unset = Unset(),
|
||||||
*,
|
*,
|
||||||
default_factory: Callable[[Self], T] | None = None,
|
default_factory: Callable[[Self], T] | Unset = Unset(),
|
||||||
target_type: type[T] | None = None,
|
target_type: type[T] | Unset = Unset(),
|
||||||
) -> None:
|
) -> None:
|
||||||
if default_factory is not None and default_value is None:
|
if not Unset.itis(default_factory):
|
||||||
super().__init__(default_factory=default_factory)
|
super().__init__(default_factory=Unset.unwrap(default_factory))
|
||||||
elif default_value is not None and default_factory is None:
|
elif not Unset.itis(default_value):
|
||||||
super().__init__(default_value)
|
super().__init__(Unset.unwrap(default_value))
|
||||||
self.__target_type: Final = target_type
|
else:
|
||||||
|
super().__init__()
|
||||||
|
self.__target_type: Final[type] = Unset.unwrap_or(target_type, object)
|
||||||
|
|
||||||
def serialize(self, value: T, /) -> bytes:
|
def serialize(self, value: T, /) -> bytes:
|
||||||
return pickle.dumps(value)
|
return pickle.dumps(value)
|
||||||
|
|
||||||
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):
|
||||||
return self._get_default()
|
return self._get_default()
|
||||||
return value # type: ignore
|
return value # type: ignore
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,9 @@
|
||||||
from typing import Any, Callable, Final, Generic, TypeVar, overload
|
from typing import Any, Callable, Final, Generic, TypeVar, overload
|
||||||
|
|
||||||
from typing_extensions import Self
|
from typing_extensions import Self
|
||||||
|
|
||||||
|
from snakia.types import Unset
|
||||||
|
|
||||||
T = TypeVar("T")
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -17,20 +20,18 @@ class PrivProperty(Generic[T]):
|
||||||
def __init__(self, *, default_factory: Callable[[Self], T]) -> None: ...
|
def __init__(self, *, default_factory: Callable[[Self], T]) -> None: ...
|
||||||
def __init__(
|
def __init__(
|
||||||
self,
|
self,
|
||||||
default_value: T | None = None,
|
default_value: T | Unset = Unset(),
|
||||||
default_factory: Callable[[Self], T] | None = None,
|
default_factory: Callable[[Self], T] | Unset = Unset(),
|
||||||
) -> None:
|
) -> None:
|
||||||
self.__default_value: Final[T | None] = default_value
|
self.__default_value: Final[T | Unset] = default_value
|
||||||
self.__default_factory: Final[Callable[[Self], T] | None] = (
|
self.__default_factory: Final[Callable[[Self], T] | Unset] = default_factory
|
||||||
default_factory
|
|
||||||
)
|
|
||||||
|
|
||||||
def _get_default(self: Self) -> T:
|
def _get_default(self: Self) -> T:
|
||||||
if self.__default_value is not None:
|
return Unset.map(
|
||||||
return self.__default_value
|
self.__default_factory,
|
||||||
if self.__default_factory is not None:
|
lambda f: f(self),
|
||||||
return self.__default_factory(self)
|
lambda _: Unset.unwrap(self.__default_value),
|
||||||
raise ValueError("Either default_value or default_factory must be set")
|
)
|
||||||
|
|
||||||
def __set_name__(self, owner: type, name: str) -> None:
|
def __set_name__(self, owner: type, name: str) -> None:
|
||||||
self.__name = f"_{owner.__name__}__{name}"
|
self.__name = f"_{owner.__name__}__{name}"
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue