main
 1from __future__ import annotations
 2
 3import sys
 4import typing_extensions
 5from typing import Any, Type, Union, Literal, Optional
 6from datetime import date, datetime
 7from typing_extensions import get_args as _get_args, get_origin as _get_origin
 8
 9from .._types import StrBytesIntFloat
10from ._datetime_parse import parse_date as _parse_date, parse_datetime as _parse_datetime
11
12_LITERAL_TYPES = {Literal, typing_extensions.Literal}
13
14
15def get_args(tp: type[Any]) -> tuple[Any, ...]:
16    return _get_args(tp)
17
18
19def get_origin(tp: type[Any]) -> type[Any] | None:
20    return _get_origin(tp)
21
22
23def is_union(tp: Optional[Type[Any]]) -> bool:
24    if sys.version_info < (3, 10):
25        return tp is Union  # type: ignore[comparison-overlap]
26    else:
27        import types
28
29        return tp is Union or tp is types.UnionType
30
31
32def is_typeddict(tp: Type[Any]) -> bool:
33    return typing_extensions.is_typeddict(tp)
34
35
36def is_literal_type(tp: Type[Any]) -> bool:
37    return get_origin(tp) in _LITERAL_TYPES
38
39
40def parse_date(value: Union[date, StrBytesIntFloat]) -> date:
41    return _parse_date(value)
42
43
44def parse_datetime(value: Union[datetime, StrBytesIntFloat]) -> datetime:
45    return _parse_datetime(value)