|
11 | 11 | import os
|
12 | 12 | import pprint
|
13 | 13 | import re
|
14 |
| -from typing import Optional |
| 14 | +import sys |
| 15 | +from typing import Optional, Union |
15 | 16 |
|
16 | 17 | from collections import UserDict, UserList, UserString, deque
|
17 | 18 | from collections.abc import MappingView, Iterable
|
|
50 | 51 | # Empirically, it is faster to check explicitly for str than for basestring.
|
51 | 52 | BaseStringTypes = str
|
52 | 53 |
|
| 54 | +# Later Python versions allow us to explicitly apply type hints based off the |
| 55 | +# return value similar to isinstance(), albeit not as precise. |
| 56 | +if sys.version_info >= (3, 13): |
| 57 | + from typing import TypeAlias, TypeIs |
| 58 | + |
| 59 | + DictTypeRet: TypeAlias = TypeIs[Union[dict, UserDict]] |
| 60 | + ListTypeRet: TypeAlias = TypeIs[Union[list, UserList, deque]] |
| 61 | + SequenceTypeRet: TypeAlias = TypeIs[Union[list, tuple, deque, UserList, MappingView]] |
| 62 | + TupleTypeRet: TypeAlias = TypeIs[tuple] |
| 63 | + StringTypeRet: TypeAlias = TypeIs[Union[str, UserString]] |
| 64 | +elif sys.version_info >= (3, 10): |
| 65 | + from typing import TypeAlias, TypeGuard |
| 66 | + |
| 67 | + DictTypeRet: TypeAlias = TypeGuard[Union[dict, UserDict]] |
| 68 | + ListTypeRet: TypeAlias = TypeGuard[Union[list, UserList, deque]] |
| 69 | + SequenceTypeRet: TypeAlias = TypeGuard[Union[list, tuple, deque, UserList, MappingView]] |
| 70 | + TupleTypeRet: TypeAlias = TypeGuard[tuple] |
| 71 | + StringTypeRet: TypeAlias = TypeGuard[Union[str, UserString]] |
| 72 | +else: |
| 73 | + DictTypeRet = Union[bool, bool] |
| 74 | + ListTypeRet = Union[bool, bool] |
| 75 | + SequenceTypeRet = Union[bool, bool] |
| 76 | + TupleTypeRet = Union[bool, bool] |
| 77 | + StringTypeRet = Union[bool, bool] |
| 78 | + |
53 | 79 |
|
54 | 80 | def is_Dict( # pylint: disable=redefined-outer-name,redefined-builtin
|
55 | 81 | obj, isinstance=isinstance, DictTypes=DictTypes
|
56 |
| -) -> bool: |
| 82 | +) -> DictTypeRet: |
57 | 83 | """Check if object is a dict."""
|
58 | 84 | return isinstance(obj, DictTypes)
|
59 | 85 |
|
60 | 86 |
|
61 | 87 | def is_List( # pylint: disable=redefined-outer-name,redefined-builtin
|
62 | 88 | obj, isinstance=isinstance, ListTypes=ListTypes
|
63 |
| -) -> bool: |
| 89 | +) -> ListTypeRet: |
64 | 90 | """Check if object is a list."""
|
65 | 91 | return isinstance(obj, ListTypes)
|
66 | 92 |
|
67 | 93 |
|
68 | 94 | def is_Sequence( # pylint: disable=redefined-outer-name,redefined-builtin
|
69 | 95 | obj, isinstance=isinstance, SequenceTypes=SequenceTypes
|
70 |
| -) -> bool: |
| 96 | +) -> SequenceTypeRet: |
71 | 97 | """Check if object is a sequence."""
|
72 | 98 | return isinstance(obj, SequenceTypes)
|
73 | 99 |
|
74 | 100 |
|
75 | 101 | def is_Tuple( # pylint: disable=redefined-builtin
|
76 | 102 | obj, isinstance=isinstance, tuple=tuple
|
77 |
| -) -> bool: |
| 103 | +) -> TupleTypeRet: |
78 | 104 | """Check if object is a tuple."""
|
79 | 105 | return isinstance(obj, tuple)
|
80 | 106 |
|
81 | 107 |
|
82 | 108 | def is_String( # pylint: disable=redefined-outer-name,redefined-builtin
|
83 | 109 | obj, isinstance=isinstance, StringTypes=StringTypes
|
84 |
| -) -> bool: |
| 110 | +) -> StringTypeRet: |
85 | 111 | """Check if object is a string."""
|
86 | 112 | return isinstance(obj, StringTypes)
|
87 | 113 |
|
|
0 commit comments