feat: add get_attrs, get_or_set_attr

This commit is contained in:
rus07tam 2025-11-23 10:14:12 +00:00
parent 694dbf99be
commit 6ca21a633c
2 changed files with 31 additions and 0 deletions

View file

@ -1,3 +1,4 @@
from .attr import get_attrs, get_or_set_attr
from .frame import frame
from .inherit import inherit
from .nolock import nolock
@ -6,6 +7,8 @@ from .throw import throw
from .to_async import to_async
__all__ = [
"get_or_set_attr",
"get_attrs",
"frame",
"inherit",
"nolock",

28
src/snakia/utils/attr.py Normal file
View file

@ -0,0 +1,28 @@
from typing import Any, TypeVar
T = TypeVar("T")
def get_or_set_attr(obj: Any, name: str, default: T) -> T:
if not hasattr(obj, name):
setattr(obj, name, default)
attr = getattr(obj, name)
if not isinstance(attr, type(default)):
setattr(obj, name, default)
return default
return attr
def get_attrs(
obj: Any, *, use_dir: bool = False, of_class: bool = False
) -> dict[str, Any]:
if of_class and not isinstance(obj, type):
obj = obj.__class__
if not use_dir:
if hasattr(obj, "__dict__"):
return obj.__dict__ # type: ignore
if hasattr(obj, "__slots__"):
return {k: getattr(obj, k) for k in obj.__slots__}
raise NotImplementedError("Unknown layout")
else:
return {k: getattr(obj, k) for k in dir(obj)}