bpo-41792: Add is_typeddict function to typing.py (GH-22254)

Closes issue41792.

Also closes https://github.com/python/typing/issues/751.
This commit is contained in:
Patrick Reader 2020-09-16 05:58:32 +01:00 committed by GitHub
parent 22415ad625
commit 0705ec8a14
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 42 additions and 0 deletions

View File

@ -1658,6 +1658,20 @@ Introspection helpers
.. versionadded:: 3.8
.. function:: is_typeddict(tp)
Check if an annotation is a TypedDict class.
For example::
class Film(TypedDict):
title: str
year: int
is_typeddict(Film) # => True
is_typeddict(Union[list, str]) # => False
.. versionadded:: 3.10
.. class:: ForwardRef
A class used for internal typing representation of string forward references.

View File

@ -16,6 +16,7 @@ from typing import Generic, ClassVar, Final, final, Protocol
from typing import cast, runtime_checkable
from typing import get_type_hints
from typing import get_origin, get_args
from typing import is_typeddict
from typing import no_type_check, no_type_check_decorator
from typing import Type
from typing import NewType
@ -3900,6 +3901,12 @@ class TypedDictTests(BaseTestCase):
'voice': str,
}
def test_is_typeddict(self):
assert is_typeddict(Point2D) is True
assert is_typeddict(Union[str, int]) is False
# classes, not instances
assert is_typeddict(Point2D()) is False
class IOTests(BaseTestCase):

View File

@ -103,6 +103,7 @@ __all__ = [
'get_args',
'get_origin',
'get_type_hints',
'is_typeddict',
'NewType',
'no_type_check',
'no_type_check_decorator',
@ -1479,6 +1480,20 @@ def get_args(tp):
return ()
def is_typeddict(tp):
"""Check if an annotation is a TypedDict class
For example::
class Film(TypedDict):
title: str
year: int
is_typeddict(Film) # => True
is_typeddict(Union[list, str]) # => False
"""
return isinstance(tp, _TypedDictMeta)
def no_type_check(arg):
"""Decorator to indicate that annotations are not type hints.

View File

@ -0,0 +1,6 @@
Add is_typeddict function to typing.py to check if a type is a TypedDict
class
Previously there was no way to check that without using private API. See the
`relevant issue in python/typing
<https://github.com/python/typing/issues/751>`