dcs-retribution/game/typeguard.py
Dan Albert 2e901f3586 Replace some isinstance calls with TypeGuard.
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).
2022-02-12 14:59:44 -08:00

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