Release/v0.5.0 #8
7 changed files with 82 additions and 37 deletions
|
|
@ -1,13 +1,16 @@
|
||||||
from .attr import get_attrs, get_or_set_attr
|
from .attrs import get_attrs, get_or_set_attr
|
||||||
from .frame import frame
|
from .calls import call, caller
|
||||||
|
from .exceptions import catch, throw
|
||||||
|
from .frames import frame
|
||||||
from .inherit import inherit
|
from .inherit import inherit
|
||||||
from .nolock import nolock
|
from .nolock import nolock
|
||||||
from .side import side, side_func
|
from .side import side, side_func
|
||||||
from .this import this
|
from .this import this
|
||||||
from .throw import throw
|
|
||||||
from .to_async import to_async
|
from .to_async import to_async
|
||||||
|
|
||||||
__all__ = [
|
__all__ = [
|
||||||
|
"call",
|
||||||
|
"caller",
|
||||||
"get_or_set_attr",
|
"get_or_set_attr",
|
||||||
"get_attrs",
|
"get_attrs",
|
||||||
"frame",
|
"frame",
|
||||||
|
|
@ -17,5 +20,6 @@ __all__ = [
|
||||||
"side_func",
|
"side_func",
|
||||||
"this",
|
"this",
|
||||||
"throw",
|
"throw",
|
||||||
|
"catch",
|
||||||
"to_async",
|
"to_async",
|
||||||
]
|
]
|
||||||
|
|
|
||||||
12
src/snakia/utils/calls.py
Normal file
12
src/snakia/utils/calls.py
Normal file
|
|
@ -0,0 +1,12 @@
|
||||||
|
from typing import Callable, ParamSpec, TypeVar
|
||||||
|
|
||||||
|
P = ParamSpec("P")
|
||||||
|
T = TypeVar("T")
|
||||||
|
|
||||||
|
|
||||||
|
def call(f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> T:
|
||||||
|
return f(*args, **kwargs)
|
||||||
|
|
||||||
|
|
||||||
|
def caller(f: Callable[P, T], *args: P.args, **kwargs: P.kwargs) -> Callable[..., T]:
|
||||||
|
return lambda *_, **__: f(*args, **kwargs)
|
||||||
62
src/snakia/utils/exceptions.py
Normal file
62
src/snakia/utils/exceptions.py
Normal file
|
|
@ -0,0 +1,62 @@
|
||||||
|
import contextlib
|
||||||
|
from typing import Any, Callable, NoReturn, TypeVar, overload
|
||||||
|
|
||||||
|
from exceptiongroup import ExceptionGroup
|
||||||
|
|
||||||
|
from snakia.types.unset import Unset
|
||||||
|
|
||||||
|
E = TypeVar("E", bound=Exception)
|
||||||
|
T = TypeVar("T")
|
||||||
|
D = TypeVar("D")
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def throw(
|
||||||
|
*exceptions: E, # pyright: ignore[reportInvalidTypeVarUse]
|
||||||
|
from_: Unset | BaseException = Unset(),
|
||||||
|
) -> NoReturn: ...
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def throw(
|
||||||
|
exception: BaseException, from_: Unset | BaseException = Unset(), /
|
||||||
|
) -> NoReturn: ...
|
||||||
|
|
||||||
|
|
||||||
|
def throw(*exceptions: Any, from_: Unset | BaseException = Unset()) -> NoReturn:
|
||||||
|
"""Throw an exception."""
|
||||||
|
if isinstance(from_, Unset):
|
||||||
|
if len(exceptions) == 1:
|
||||||
|
raise exceptions[0]
|
||||||
|
raise ExceptionGroup("", exceptions)
|
||||||
|
if len(exceptions) == 1:
|
||||||
|
raise exceptions[0] from from_
|
||||||
|
raise ExceptionGroup("", exceptions) from from_
|
||||||
|
|
||||||
|
|
||||||
|
contextlib.suppress()
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def catch(
|
||||||
|
func: Callable[[], T],
|
||||||
|
*exceptions: type[Exception] | type[BaseException],
|
||||||
|
default: None = None,
|
||||||
|
) -> T | None: ...
|
||||||
|
@overload
|
||||||
|
def catch(
|
||||||
|
func: Callable[[], T],
|
||||||
|
*exceptions: type[Exception] | type[BaseException],
|
||||||
|
default: D,
|
||||||
|
) -> T | D: ...
|
||||||
|
def catch(
|
||||||
|
func: Callable[[], T],
|
||||||
|
*exceptions: type[Exception] | type[BaseException],
|
||||||
|
default: Any = None,
|
||||||
|
) -> T | Any:
|
||||||
|
try:
|
||||||
|
return func()
|
||||||
|
except BaseException as e:
|
||||||
|
if any(isinstance(e, exc) for exc in exceptions):
|
||||||
|
return default
|
||||||
|
raise
|
||||||
|
|
@ -2,7 +2,7 @@ import gc
|
||||||
from types import FunctionType, MethodType
|
from types import FunctionType, MethodType
|
||||||
from typing import Any
|
from typing import Any
|
||||||
|
|
||||||
from .frame import frame
|
from .frames import frame
|
||||||
|
|
||||||
|
|
||||||
def this() -> Any:
|
def this() -> Any:
|
||||||
|
|
|
||||||
|
|
@ -1,33 +0,0 @@
|
||||||
from typing import Any, NoReturn, TypeVar, overload
|
|
||||||
|
|
||||||
from exceptiongroup import ExceptionGroup
|
|
||||||
|
|
||||||
from snakia.types.unset import Unset
|
|
||||||
|
|
||||||
T = TypeVar("T", bound=Exception)
|
|
||||||
|
|
||||||
|
|
||||||
@overload
|
|
||||||
def throw(
|
|
||||||
*exceptions: T, # pyright: ignore[reportInvalidTypeVarUse]
|
|
||||||
from_: Unset | BaseException = Unset(),
|
|
||||||
) -> NoReturn: ...
|
|
||||||
|
|
||||||
|
|
||||||
@overload
|
|
||||||
def throw(
|
|
||||||
exception: BaseException, from_: Unset | BaseException = Unset(), /
|
|
||||||
) -> NoReturn: ...
|
|
||||||
|
|
||||||
|
|
||||||
def throw(
|
|
||||||
*exceptions: Any, from_: Unset | BaseException = Unset()
|
|
||||||
) -> NoReturn:
|
|
||||||
"""Throw an exception."""
|
|
||||||
if isinstance(from_, Unset):
|
|
||||||
if len(exceptions) == 1:
|
|
||||||
raise exceptions[0]
|
|
||||||
raise ExceptionGroup("", exceptions)
|
|
||||||
if len(exceptions) == 1:
|
|
||||||
raise exceptions[0] from from_
|
|
||||||
raise ExceptionGroup("", exceptions) from from_
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue