codekingpro/portable-devtools
114k
1"""2compatibility functions for different Python versions3"""4 5# Copyright (C) 2021 The Psycopg Team6 7import sys8import asyncio9from typing import Any, Awaitable, Generator, Optional, Sequence, Union, TypeVar10 11# NOTE: TypeAlias cannot be exported by this module, as pyright special-cases it.12# For this raisin it must be imported directly from typing_extension where used.13# See https://github.com/microsoft/pyright/issues/419714from typing_extensions import TypeAlias15 16if sys.version_info >= (3, 8):17 from typing import Protocol18else:19 from typing_extensions import Protocol20 21T = TypeVar("T")22FutureT: TypeAlias = Union["asyncio.Future[T]", Generator[Any, None, T], Awaitable[T]]23 24if sys.version_info >= (3, 8):25 create_task = asyncio.create_task26 from math import prod27 28else:29 30 def create_task(31 coro: FutureT[T], name: Optional[str] = None32 ) -> "asyncio.Future[T]":33 return asyncio.create_task(coro)34 35 from functools import reduce36 37 def prod(seq: Sequence[int]) -> int:38 return reduce(int.__mul__, seq, 1)39 40 41if sys.version_info >= (3, 9):42 from zoneinfo import ZoneInfo43 from functools import cache44 from collections import Counter, deque as Deque45else:46 from typing import Counter, Deque47 from functools import lru_cache48 from backports.zoneinfo import ZoneInfo49 50 cache = lru_cache(maxsize=None)51 52if sys.version_info >= (3, 10):53 from typing import TypeGuard54else:55 from typing_extensions import TypeGuard56 57if sys.version_info >= (3, 11):58 from typing import LiteralString59else:60 from typing_extensions import LiteralString61 62__all__ = [63 "Counter",64 "Deque",65 "LiteralString",66 "Protocol",67 "TypeGuard",68 "ZoneInfo",69 "cache",70 "create_task",71 "prod",72]73 