feat(property): add strict mode to Readonly
This commit is contained in:
parent
d640f21107
commit
737f21bf06
1 changed files with 17 additions and 12 deletions
|
|
@ -1,27 +1,32 @@
|
|||
from typing import Any, Callable
|
||||
|
||||
from snakia.utils import throw
|
||||
|
||||
class Readonly[T]:
|
||||
from .property import Property
|
||||
|
||||
|
||||
class Readonly[T](Property[T]):
|
||||
"""
|
||||
Readonly property.
|
||||
"""
|
||||
|
||||
__slots__ = ("__fget",)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
fget: Callable[[Any], T],
|
||||
*,
|
||||
strict: bool = False,
|
||||
) -> None:
|
||||
self.__fget = fget
|
||||
|
||||
def __get__(self, instance: Any, owner: type | None = None, /) -> T:
|
||||
return self.__fget(instance)
|
||||
|
||||
def __set__(self, instance: Any, value: T, /) -> None:
|
||||
pass
|
||||
super().__init__(
|
||||
fget=fget,
|
||||
fset=(
|
||||
(lambda *_: throw(TypeError("Cannot set readonly property")))
|
||||
if strict
|
||||
else lambda *_: None
|
||||
),
|
||||
)
|
||||
|
||||
|
||||
def readonly[T](value: T) -> Readonly[T]:
|
||||
def readonly[T](value: T, *, strict: bool = False) -> Readonly[T]:
|
||||
"""Create a readonly property with the given value.
|
||||
|
||||
Args:
|
||||
|
|
@ -30,4 +35,4 @@ def readonly[T](value: T) -> Readonly[T]:
|
|||
Returns:
|
||||
Readonly[T]: The readonly property.
|
||||
"""
|
||||
return Readonly(lambda _: value)
|
||||
return Readonly(lambda _: value, strict=strict)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue