pyre_extensions/refinement.py (13 lines of code) (raw):
# Copyright (c) Meta Platforms, Inc. and affiliates.
#
# This source code is licensed under the MIT license found in the
# LICENSE file in the root directory of this source tree.
# Helper functions for type refinement or asserts.
from typing import Any, Optional, Type, TypeVar
_T = TypeVar("_T")
_TClass = TypeVar("_TClass")
def none_throws(optional: Optional[_T], message: str = "Unexpected `None`") -> _T:
"""Convert an optional to its value. Raises an `AssertionError` if the
value is `None`"""
if optional is None:
raise AssertionError(message)
return optional
def assert_is_instance(obj: object, cls: Type[_TClass]) -> _TClass:
"""Assert that the given object is an instance of the given class. Raises a
`TypeError` if not."""
if not isinstance(obj, cls):
raise TypeError(f"obj is not an instance of cls: obj={obj} cls={cls}")
return obj
# pyre-ignore[2]: Intentional `Any` input type.
def safe_cast(new_type: Type[_T], value: Any) -> _T:
"""safe_cast will change the type checker's inference of x if it was
already a subtype of what we are casting to, and error otherwise."""
return value