From fef497b0c21eddd539df8b657c770207d87828d9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alex=20Gr=C3=B6nholm?= Date: Sat, 27 Jun 2026 12:06:36 +0300 Subject: [PATCH] Use the PEP 661 sentinel type where appropriate --- pyproject.toml | 2 +- src/anyio/_backends/_trio.py | 5 ++++- src/anyio/_core/_typedattr.py | 6 +++++- src/anyio/itertools.py | 5 ++++- 4 files changed, 14 insertions(+), 4 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7c92cf95f..0a5cf8059 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 602b35b5c..7243e0f30 100644 --- a/src/anyio/_backends/_trio.py +++ b/src/anyio/_backends/_trio.py @@ -90,6 +90,9 @@ if TYPE_CHECKING: from _typeshed import FileDescriptorLike +if sys.version_info < (3, 15): + from typing_extensions import sentinel + if sys.version_info >= (3, 11): from typing import TypeVarTuple, Unpack else: @@ -195,7 +198,7 @@ def shield(self, value: bool) -> None: # Task groups # -empty_start_value = object() +empty_start_value = sentinel("empty_start_value") class _TrioTaskStatus(Generic[T_contra], abc.TaskStatus[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 7e5248e4b..1c545cb21 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)