71 lines
2.3 KiB
Python
71 lines
2.3 KiB
Python
import sys
|
|
from collections.abc import Callable, Iterator, Mapping
|
|
from typing import Any, ClassVar, Generic, TypeVar, overload
|
|
from typing_extensions import ParamSpec, final
|
|
|
|
if sys.version_info >= (3, 9):
|
|
from types import GenericAlias
|
|
|
|
__all__ = ("Context", "ContextVar", "Token", "copy_context")
|
|
|
|
_T = TypeVar("_T")
|
|
_D = TypeVar("_D")
|
|
_P = ParamSpec("_P")
|
|
|
|
@final
|
|
class ContextVar(Generic[_T]):
|
|
@overload
|
|
def __init__(self, name: str) -> None: ...
|
|
@overload
|
|
def __init__(self, name: str, *, default: _T) -> None: ...
|
|
def __hash__(self) -> int: ...
|
|
@property
|
|
def name(self) -> str: ...
|
|
@overload
|
|
def get(self) -> _T: ...
|
|
if sys.version_info >= (3, 8):
|
|
@overload
|
|
def get(self, default: _T) -> _T: ...
|
|
@overload
|
|
def get(self, default: _D) -> _D | _T: ...
|
|
else:
|
|
@overload
|
|
def get(self, __default: _T) -> _T: ...
|
|
@overload
|
|
def get(self, __default: _D) -> _D | _T: ...
|
|
|
|
def set(self, __value: _T) -> Token[_T]: ...
|
|
def reset(self, __token: Token[_T]) -> None: ...
|
|
if sys.version_info >= (3, 9):
|
|
def __class_getitem__(cls, item: Any) -> GenericAlias: ...
|
|
|
|
@final
|
|
class Token(Generic[_T]):
|
|
@property
|
|
def var(self) -> ContextVar[_T]: ...
|
|
@property
|
|
def old_value(self) -> Any: ... # returns either _T or MISSING, but that's hard to express
|
|
MISSING: ClassVar[object]
|
|
if sys.version_info >= (3, 9):
|
|
def __class_getitem__(cls, item: Any) -> GenericAlias: ...
|
|
|
|
def copy_context() -> Context: ...
|
|
|
|
# It doesn't make sense to make this generic, because for most Contexts each ContextVar will have
|
|
# a different value.
|
|
@final
|
|
class Context(Mapping[ContextVar[Any], Any]):
|
|
def __init__(self) -> None: ...
|
|
@overload
|
|
def get(self, __key: ContextVar[_T], __default: None = None) -> _T | None: ... # type: ignore[misc] # overlapping overloads
|
|
@overload
|
|
def get(self, __key: ContextVar[_T], __default: _T) -> _T: ...
|
|
@overload
|
|
def get(self, __key: ContextVar[_T], __default: _D) -> _T | _D: ...
|
|
def run(self, callable: Callable[_P, _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ...
|
|
def copy(self) -> Context: ...
|
|
def __getitem__(self, __key: ContextVar[_T]) -> _T: ...
|
|
def __iter__(self) -> Iterator[ContextVar[Any]]: ...
|
|
def __len__(self) -> int: ...
|
|
def __eq__(self, __value: object) -> bool: ...
|