_compat.py 1.2 KB

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