Skip to content

Commit

Permalink
Add assert_type
Browse files Browse the repository at this point in the history
  • Loading branch information
JelleZijlstra committed Mar 17, 2022
1 parent 95c9c2b commit 9ffa1e1
Show file tree
Hide file tree
Showing 4 changed files with 43 additions and 1 deletion.
4 changes: 4 additions & 0 deletions typing_extensions/CHANGELOG
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
# Unreleased

- Add `typing.assert_type`. Backport from bpo-46480.

# Release 4.1.1 (February 13, 2022)

- Fix importing `typing_extensions` on Python 3.7.0 and 3.7.1. Original
Expand Down
1 change: 1 addition & 0 deletions typing_extensions/README.rst
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@ This module currently contains the following:
- In ``typing`` since Python 3.11

- ``assert_never``
- ``assert_type``
- ``Never``
- ``reveal_type``
- ``Self`` (see PEP 673)
Expand Down
18 changes: 17 additions & 1 deletion typing_extensions/src/test_typing_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
from unittest import TestCase, main, skipUnless, skipIf
from test import ann_module, ann_module2, ann_module3
import typing
from typing import TypeVar, Optional, Union, Any
from typing import TypeVar, Optional, Union, Any, AnyStr
from typing import T, KT, VT # Not in __all__.
from typing import Tuple, List, Dict, Iterable, Iterator, Callable
from typing import Generic, NamedTuple
Expand All @@ -23,6 +23,7 @@
from typing_extensions import Awaitable, AsyncIterator, AsyncContextManager, Required, NotRequired
from typing_extensions import Protocol, runtime, runtime_checkable, Annotated, overload, final, is_typeddict
from typing_extensions import TypeVarTuple, Unpack, dataclass_transform, reveal_type, Never, assert_never, LiteralString
from typing_extensions import assert_type
try:
from typing_extensions import get_type_hints
except ImportError:
Expand Down Expand Up @@ -445,6 +446,21 @@ def blah():
blah()


class AssertTypeTests(BaseTestCase):

def test_basics(self):
arg = 42
self.assertIs(assert_type(arg, int), arg)
self.assertIs(assert_type(arg, Union[str, float]), arg)
self.assertIs(assert_type(arg, AnyStr), arg)
self.assertIs(assert_type(arg, None), arg)

def test_errors(self):
# Bogus calls are not expected to fail.
arg = 42
self.assertIs(assert_type(arg, 42), arg)
self.assertIs(assert_type(arg, 'hello'), arg)


T_a = TypeVar('T_a')

Expand Down
21 changes: 21 additions & 0 deletions typing_extensions/src/typing_extensions.py
Original file line number Diff line number Diff line change
Expand Up @@ -1231,6 +1231,27 @@ class Film(TypedDict):
"""
return isinstance(tp, tuple(_TYPEDDICT_TYPES))


if hasattr(typing, "assert_type"):
assert_type = typing.assert_type

else:
def assert_type(val, typ, /):
"""Assert (to the type checker) that the value is of the given type.
When the type checker encounters a call to assert_type(), it
emits an error if the value is not of the specified type::
def greet(name: str) -> None:
assert_type(name, str) # ok
assert_type(name, int) # type checker error
At runtime this returns the first argument unchanged and otherwise
does nothing.
"""
return val


if hasattr(typing, "Required"):
get_type_hints = typing.get_type_hints
elif PEP_560:
Expand Down

0 comments on commit 9ffa1e1

Please sign in to comment.