Skip to content

Commit

Permalink
Add assert_type (#1103)
Browse files Browse the repository at this point in the history
  • Loading branch information
JelleZijlstra committed Mar 22, 2022
1 parent 07fb800 commit db20497
Show file tree
Hide file tree
Showing 4 changed files with 40 additions and 2 deletions.
1 change: 1 addition & 0 deletions typing_extensions/CHANGELOG
@@ -1,5 +1,6 @@
# Unreleased

- Add `typing.assert_type`. Backport from bpo-46480.
- Drop support for Python 3.6. Original patch by Adam Turner (@AA-Turner).

# Release 4.1.1 (February 13, 2022)
Expand Down
1 change: 1 addition & 0 deletions typing_extensions/README.rst
Expand Up @@ -46,6 +46,7 @@ This module currently contains the following:
- In ``typing`` since Python 3.11

- ``assert_never``
- ``assert_type``
- ``LiteralString`` (see PEP 675)
- ``Never``
- ``NotRequired`` (see PEP 655)
Expand Down
19 changes: 17 additions & 2 deletions typing_extensions/src/test_typing_extensions.py
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,7 +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 get_type_hints, get_origin, get_args
from typing_extensions import assert_type, get_type_hints, get_origin, get_args

# Flags used to mark tests that only apply after a specific
# version of the typing module.
Expand Down Expand Up @@ -425,6 +425,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
Expand Up @@ -717,6 +717,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
else:
Expand Down

0 comments on commit db20497

Please sign in to comment.