================ @@ -64,48 +64,81 @@ from ctypes import * -import collections.abc import os +import sys from enum import Enum +from typing import ( + Any, + Callable, + Generic, + Optional, + Type as TType, + TypeVar, + TYPE_CHECKING, + Union as TUnion, +) +from typing_extensions import Protocol, TypeAlias + +if TYPE_CHECKING: + from ctypes import _Pointer + + StrPath: TypeAlias = TUnion[str, os.PathLike[str]] + LibFunc: TypeAlias = TUnion[ + "tuple[str, Optional[list[Any]]]", + "tuple[str, Optional[list[Any]], Any]", + "tuple[str, Optional[list[Any]], Any, Callable[..., Any]]", + ] + CObjP: TypeAlias = _Pointer[Any] + + TSeq = TypeVar("TSeq", covariant=True) + + class NoSliceSequence(Protocol[TSeq]): + def __len__(self) -> int: + ... + + def __getitem__(self, key: int) -> TSeq: + ... ---------------- DeinAlptraum wrote:
This defines the proper interface for all the classes with "Iterator" in their name. None of them are actually iterators in terms of the Python protocol `Iterator`, as they are expected to support `__len__` and __getitem__`. They're the closest to the `Sequence` protocol, but without the support for slicing. https://github.com/llvm/llvm-project/pull/98745 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits