diff --git a/pyproject.toml b/pyproject.toml index 22cfd57f4..010e874be 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -30,7 +30,7 @@ requires-python = ">= 3.10" dependencies = [ "exceptiongroup >= 1.0.2; python_version < '3.11'", "idna >= 2.8", - "typing_extensions >= 4.5; python_version < '3.13'", + "typing_extensions >= 4.16.0; python_version < '3.15'", ] dynamic = ["version"] diff --git a/src/anyio/_backends/_trio.py b/src/anyio/_backends/_trio.py index 7ed0f2fee..2e67786e8 100644 --- a/src/anyio/_backends/_trio.py +++ b/src/anyio/_backends/_trio.py @@ -91,6 +91,9 @@ from ..streams.memory import MemoryObjectSendStream +if sys.version_info < (3, 15): + from typing_extensions import sentinel + if sys.version_info >= (3, 11): from typing import Self, TypeVarTuple, Unpack else: @@ -196,7 +199,7 @@ def shield(self, value: bool) -> None: # Task groups # -empty_start_value = object() +empty_start_value = sentinel("empty_start_value") class _TrioTaskStatus(abc.TaskStatus[T_contra], Generic[T_contra]): diff --git a/src/anyio/_core/_typedattr.py b/src/anyio/_core/_typedattr.py index f358a448c..59d3da9d8 100644 --- a/src/anyio/_core/_typedattr.py +++ b/src/anyio/_core/_typedattr.py @@ -1,13 +1,17 @@ from __future__ import annotations +import sys from collections.abc import Callable, Mapping from typing import Any, TypeVar, final, overload from ._exceptions import TypedAttributeLookupError +if sys.version_info < (3, 15): + from typing_extensions import sentinel + T_Attr = TypeVar("T_Attr") T_Default = TypeVar("T_Default") -undefined = object() +undefined = sentinel("undefined") def typed_attribute() -> Any: diff --git a/src/anyio/itertools.py b/src/anyio/itertools.py index 867e3360f..2a10cfd3b 100644 --- a/src/anyio/itertools.py +++ b/src/anyio/itertools.py @@ -42,9 +42,12 @@ from ._core._tasks import CancelScope from .lowlevel import cancel_shielded_checkpoint, checkpoint, checkpoint_if_cancelled +if sys.version_info < (3, 15): + from typing_extensions import sentinel + T = TypeVar("T") R = TypeVar("R") -_tee_end = object() +_tee_end = sentinel("_tee_end") @dataclass(eq=False)