mirror of
https://github.com/dcs-retribution/dcs-retribution.git
synced 2025-11-10 15:41:24 +00:00
These aren't as ergonomic as I'd hoped because of https://www.python.org/dev/peps/pep-0647/#narrowing-of-implicit-self-and-cls-parameters. I added a decorator `@self_type_guard` so we can avoid needing to import the descendent types in the typeguard implementation (which wouldn't fix any circular imports, just move them).
21 lines
544 B
Python
21 lines
544 B
Python
from __future__ import annotations
|
|
|
|
from typing import Callable, TypeGuard, TypeVar
|
|
|
|
SelfT = TypeVar("SelfT")
|
|
BaseT = TypeVar("BaseT")
|
|
GuardT = TypeVar("GuardT")
|
|
|
|
|
|
def self_type_guard(
|
|
f: Callable[[SelfT, BaseT], TypeGuard[GuardT]]
|
|
) -> Callable[[SelfT, BaseT], TypeGuard[GuardT]]:
|
|
def decorator(s: SelfT, arg: BaseT) -> TypeGuard[GuardT]:
|
|
if id(s) != id(arg):
|
|
raise ValueError(
|
|
"self type guards must be called with self as the argument"
|
|
)
|
|
return f(s, arg)
|
|
|
|
return decorator
|