Source code for phantom.predicates.generic

import types
from typing import Tuple
from typing import Union

import typeguard
from typing_extensions import get_args

from phantom._utils.misc import is_union_type

from . import Predicate
from ._utils import bind_name


[docs]def equal(a: object) -> Predicate[object]: """Create a new predicate that succeeds when its argument is equal to ``a``.""" @bind_name(equal, a) def check(b: object) -> bool: return a == b return check
[docs]def identical(a: object) -> Predicate[object]: """Create a new predicate that succeeds when its argument is identical to ``a``.""" @bind_name(identical, a) def check(b: object) -> bool: return a is b return check
[docs]def of_type(t: Union[type, Tuple[type, ...]]) -> Predicate[object]: """ Create a new predicate that succeeds when its argument is an instance of ``t``. """ @bind_name(of_type, t) def check(a: object) -> bool: return isinstance(a, t) return check
def of_complex_type(t: type) -> Predicate[object]: # Hack to support PEP 604 before it's implemented in typeguard, tracking issue for # that feature is here: https://github.com/agronholm/typeguard/issues/222 # Rewrite types.UnionType objects generated by PEP 604 unions as types.GenericAlias, # as if it was generated by a Union[]. t = ( types.GenericAlias(Union, get_args(t)) # type: ignore if is_union_type(t) else t ) @bind_name(of_complex_type, t) def check(a: object) -> bool: try: typeguard.check_type("a", a, t, globals={}, locals={}) except TypeError: return False return True return check