diff options
Diffstat (limited to 'numpy')
41 files changed, 474 insertions, 811 deletions
diff --git a/numpy/__init__.pyi b/numpy/__init__.pyi index fb68f4a56..f398f67b7 100644 --- a/numpy/__init__.pyi +++ b/numpy/__init__.pyi @@ -164,6 +164,7 @@ from numpy.typing._extended_precision import ( ) from typing import ( + Literal as L, Any, ByteString, Callable, @@ -189,13 +190,11 @@ from typing import ( Type, TypeVar, Union, + Protocol, + SupportsIndex, + Final, ) -if sys.version_info >= (3, 8): - from typing import Literal as L, Protocol, SupportsIndex, Final -else: - from typing_extensions import Literal as L, Protocol, SupportsIndex, Final - # Ensures that the stubs are picked up from numpy import ( char as char, @@ -3163,28 +3162,16 @@ class datetime64(generic): __gt__: _ComparisonOp[datetime64, _ArrayLikeDT64_co] __ge__: _ComparisonOp[datetime64, _ArrayLikeDT64_co] -# Support for `__index__` was added in python 3.8 (bpo-20092) -if sys.version_info >= (3, 8): - _IntValue = Union[SupportsInt, _CharLike_co, SupportsIndex] - _FloatValue = Union[None, _CharLike_co, SupportsFloat, SupportsIndex] - _ComplexValue = Union[ - None, - _CharLike_co, - SupportsFloat, - SupportsComplex, - SupportsIndex, - complex, # `complex` is not a subtype of `SupportsComplex` - ] -else: - _IntValue = Union[SupportsInt, _CharLike_co] - _FloatValue = Union[None, _CharLike_co, SupportsFloat] - _ComplexValue = Union[ - None, - _CharLike_co, - SupportsFloat, - SupportsComplex, - complex, - ] +_IntValue = Union[SupportsInt, _CharLike_co, SupportsIndex] +_FloatValue = Union[None, _CharLike_co, SupportsFloat, SupportsIndex] +_ComplexValue = Union[ + None, + _CharLike_co, + SupportsFloat, + SupportsComplex, + SupportsIndex, + complex, # `complex` is not a subtype of `SupportsComplex` +] class integer(number[_NBit1]): # type: ignore @property diff --git a/numpy/_pytesttester.pyi b/numpy/_pytesttester.pyi index 693f4128a..0be64b3f7 100644 --- a/numpy/_pytesttester.pyi +++ b/numpy/_pytesttester.pyi @@ -1,5 +1,4 @@ -from typing import List, Iterable -from typing_extensions import Literal as L +from typing import List, Iterable, Literal as L __all__: List[str] diff --git a/numpy/core/_asarray.pyi b/numpy/core/_asarray.pyi index 1928cfe12..fee9b7b6e 100644 --- a/numpy/core/_asarray.pyi +++ b/numpy/core/_asarray.pyi @@ -1,14 +1,8 @@ -import sys -from typing import TypeVar, Union, Iterable, overload +from typing import TypeVar, Union, Iterable, overload, Literal from numpy import ndarray from numpy.typing import ArrayLike, DTypeLike -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - _ArrayType = TypeVar("_ArrayType", bound=ndarray) _Requirements = Literal[ diff --git a/numpy/core/_type_aliases.pyi b/numpy/core/_type_aliases.pyi index 6a1099cd3..c10d072f9 100644 --- a/numpy/core/_type_aliases.pyi +++ b/numpy/core/_type_aliases.pyi @@ -1,13 +1,7 @@ -import sys -from typing import Dict, Union, Type, List +from typing import Dict, Union, Type, List, TypedDict from numpy import generic, signedinteger, unsignedinteger, floating, complexfloating -if sys.version_info >= (3, 8): - from typing import TypedDict -else: - from typing_extensions import TypedDict - class _SCTypes(TypedDict): int: List[Type[signedinteger]] uint: List[Type[unsignedinteger]] diff --git a/numpy/core/_ufunc_config.pyi b/numpy/core/_ufunc_config.pyi index e90f1c510..aa48ddba7 100644 --- a/numpy/core/_ufunc_config.pyi +++ b/numpy/core/_ufunc_config.pyi @@ -1,10 +1,4 @@ -import sys -from typing import Optional, Union, Callable, Any - -if sys.version_info >= (3, 8): - from typing import Literal, Protocol, TypedDict -else: - from typing_extensions import Literal, Protocol, TypedDict +from typing import Optional, Union, Callable, Any, Literal, Protocol, TypedDict _ErrKind = Literal["ignore", "warn", "raise", "call", "print", "log"] _ErrFunc = Callable[[str, int], Any] diff --git a/numpy/core/arrayprint.pyi b/numpy/core/arrayprint.pyi index ac2b6f5a8..df22efed6 100644 --- a/numpy/core/arrayprint.pyi +++ b/numpy/core/arrayprint.pyi @@ -1,6 +1,5 @@ -import sys from types import TracebackType -from typing import Any, Optional, Callable, Union, Type +from typing import Any, Optional, Callable, Union, Type, Literal, TypedDict, SupportsIndex # Using a private class is by no means ideal, but it is simply a consquence # of a `contextlib.context` returning an instance of aformentioned class @@ -23,11 +22,6 @@ from numpy import ( ) from numpy.typing import ArrayLike, _CharLike_co, _FloatLike_co -if sys.version_info > (3, 8): - from typing import Literal, TypedDict, SupportsIndex -else: - from typing_extensions import Literal, TypedDict, SupportsIndex - _FloatMode = Literal["fixed", "unique", "maxprec", "maxprec_equal"] class _FormatDict(TypedDict, total=False): diff --git a/numpy/core/einsumfunc.pyi b/numpy/core/einsumfunc.pyi index 2457e8719..bb02590e6 100644 --- a/numpy/core/einsumfunc.pyi +++ b/numpy/core/einsumfunc.pyi @@ -1,5 +1,4 @@ -import sys -from typing import List, TypeVar, Optional, Any, overload, Union, Tuple, Sequence +from typing import List, TypeVar, Optional, Any, overload, Union, Tuple, Sequence, Literal from numpy import ( ndarray, @@ -26,11 +25,6 @@ from numpy.typing import ( _DTypeLikeComplex_co, ) -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - _ArrayType = TypeVar( "_ArrayType", bound=ndarray[Any, dtype[Union[bool_, number[Any]]]], diff --git a/numpy/core/fromnumeric.pyi b/numpy/core/fromnumeric.pyi index 45057e4b1..3cbe1d5c5 100644 --- a/numpy/core/fromnumeric.pyi +++ b/numpy/core/fromnumeric.pyi @@ -1,6 +1,5 @@ -import sys import datetime as dt -from typing import Optional, Union, Sequence, Tuple, Any, overload, TypeVar +from typing import Optional, Union, Sequence, Tuple, Any, overload, TypeVar, Literal from numpy import ( ndarray, @@ -26,11 +25,6 @@ from numpy.typing import ( _NumberLike_co, ) -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - # Various annotations for scalars # While dt.datetime and dt.timedelta are not technically part of NumPy, diff --git a/numpy/core/function_base.pyi b/numpy/core/function_base.pyi index b5d6ca6ab..c35629aa7 100644 --- a/numpy/core/function_base.pyi +++ b/numpy/core/function_base.pyi @@ -1,14 +1,8 @@ -import sys -from typing import overload, Tuple, Union, Sequence, Any +from typing import overload, Tuple, Union, Sequence, Any, SupportsIndex, Literal from numpy import ndarray from numpy.typing import ArrayLike, DTypeLike, _SupportsArray, _NumberLike_co -if sys.version_info >= (3, 8): - from typing import SupportsIndex, Literal -else: - from typing_extensions import SupportsIndex, Literal - # TODO: wait for support for recursive types _ArrayLikeNested = Sequence[Sequence[Any]] _ArrayLikeNumber = Union[ diff --git a/numpy/core/multiarray.pyi b/numpy/core/multiarray.pyi index a7d2e6bbf..b807ddff0 100644 --- a/numpy/core/multiarray.pyi +++ b/numpy/core/multiarray.pyi @@ -1,9 +1,9 @@ # TODO: Sort out any and all missing functions in this namespace import os -import sys import datetime as dt from typing import ( + Literal as L, Any, Callable, IO, @@ -16,6 +16,9 @@ from typing import ( Union, Sequence, Tuple, + SupportsIndex, + final, + Final, ) from numpy import ( @@ -78,11 +81,6 @@ from numpy.typing import ( _TD64Like_co, ) -if sys.version_info >= (3, 8): - from typing import SupportsIndex, final, Final, Literal as L -else: - from typing_extensions import SupportsIndex, final, Final, Literal as L - _SCT = TypeVar("_SCT", bound=generic) _ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) diff --git a/numpy/core/numeric.pyi b/numpy/core/numeric.pyi index 3c2b553ec..54ab4b7c8 100644 --- a/numpy/core/numeric.pyi +++ b/numpy/core/numeric.pyi @@ -1,4 +1,3 @@ -import sys from typing import ( Any, Optional, @@ -10,16 +9,12 @@ from typing import ( overload, TypeVar, Iterable, + Literal, ) from numpy import ndarray, generic, dtype, bool_, signedinteger, _OrderKACF, _OrderCF from numpy.typing import ArrayLike, DTypeLike, _ShapeLike -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - _T = TypeVar("_T") _ArrayType = TypeVar("_ArrayType", bound=ndarray) diff --git a/numpy/core/numerictypes.pyi b/numpy/core/numerictypes.pyi index d5e3ccffb..1d3ff773b 100644 --- a/numpy/core/numerictypes.pyi +++ b/numpy/core/numerictypes.pyi @@ -1,6 +1,7 @@ import sys import types from typing import ( + Literal as L, Type, Union, Tuple, @@ -10,6 +11,8 @@ from typing import ( Dict, List, Iterable, + Protocol, + TypedDict, ) from numpy import ( @@ -49,11 +52,6 @@ from numpy.core._type_aliases import ( from numpy.typing import DTypeLike, ArrayLike, _SupportsDType -if sys.version_info >= (3, 8): - from typing import Literal as L, Protocol, TypedDict -else: - from typing_extensions import Literal as L, Protocol, TypedDict - _T = TypeVar("_T") _SCT = TypeVar("_SCT", bound=generic) diff --git a/numpy/core/shape_base.pyi b/numpy/core/shape_base.pyi index 9aaeceed7..a640991d3 100644 --- a/numpy/core/shape_base.pyi +++ b/numpy/core/shape_base.pyi @@ -1,14 +1,8 @@ -import sys -from typing import TypeVar, overload, List, Sequence, Any +from typing import TypeVar, overload, List, Sequence, Any, SupportsIndex from numpy import generic, dtype from numpy.typing import ArrayLike, NDArray, _NestedSequence, _SupportsArray -if sys.version_info >= (3, 8): - from typing import SupportsIndex -else: - from typing_extensions import SupportsIndex - _SCT = TypeVar("_SCT", bound=generic) _ArrayType = TypeVar("_ArrayType", bound=NDArray[Any]) diff --git a/numpy/f2py/__init__.pyi b/numpy/f2py/__init__.pyi index 7d8e092ea..e52e12bbd 100644 --- a/numpy/f2py/__init__.pyi +++ b/numpy/f2py/__init__.pyi @@ -1,7 +1,6 @@ import os import subprocess -from typing import Any, List, Iterable, Dict, overload -from typing_extensions import TypedDict, Literal as L +from typing import Literal as L, Any, List, Iterable, Dict, overload, TypedDict from numpy._pytesttester import PytestTester diff --git a/numpy/lib/arraypad.pyi b/numpy/lib/arraypad.pyi index df9538dd7..d6e07a6bd 100644 --- a/numpy/lib/arraypad.pyi +++ b/numpy/lib/arraypad.pyi @@ -1,11 +1,12 @@ -import sys from typing import ( + Literal as L, Any, Dict, List, overload, Tuple, TypeVar, + Protocol, ) from numpy import ndarray, dtype, generic @@ -18,11 +19,6 @@ from numpy.typing import ( _SupportsArray, ) -if sys.version_info >= (3, 8): - from typing import Literal as L, Protocol -else: - from typing_extensions import Literal as L, Protocol - _SCT = TypeVar("_SCT", bound=generic) class _ModeFunc(Protocol): diff --git a/numpy/lib/arrayterator.pyi b/numpy/lib/arrayterator.pyi index 39d6fd843..82c669206 100644 --- a/numpy/lib/arrayterator.pyi +++ b/numpy/lib/arrayterator.pyi @@ -1,4 +1,3 @@ -import sys from typing import ( List, Any, diff --git a/numpy/lib/format.pyi b/numpy/lib/format.pyi index 4c44d57bf..092245daf 100644 --- a/numpy/lib/format.pyi +++ b/numpy/lib/format.pyi @@ -1,10 +1,4 @@ -import sys -from typing import Any, List, Set - -if sys.version_info >= (3, 8): - from typing import Literal, Final -else: - from typing_extensions import Literal, Final +from typing import Any, List, Set, Literal, Final __all__: List[str] diff --git a/numpy/lib/index_tricks.pyi b/numpy/lib/index_tricks.pyi index 0f9ae94a9..530be3cae 100644 --- a/numpy/lib/index_tricks.pyi +++ b/numpy/lib/index_tricks.pyi @@ -1,4 +1,3 @@ -import sys from typing import ( Any, Tuple, @@ -8,6 +7,8 @@ from typing import ( List, Union, Sequence, + Literal, + SupportsIndex, ) from numpy import ( @@ -49,11 +50,6 @@ from numpy.core.multiarray import ( ravel_multi_index as ravel_multi_index, ) -if sys.version_info >= (3, 8): - from typing import Literal, SupportsIndex -else: - from typing_extensions import Literal, SupportsIndex - _T = TypeVar("_T") _DType = TypeVar("_DType", bound=dtype[Any]) _BoolType = TypeVar("_BoolType", Literal[True], Literal[False]) diff --git a/numpy/lib/npyio.pyi b/numpy/lib/npyio.pyi index de6bc3ded..1321afb55 100644 --- a/numpy/lib/npyio.pyi +++ b/numpy/lib/npyio.pyi @@ -3,6 +3,7 @@ import sys import zipfile import types from typing import ( + Literal as L, Any, Mapping, TypeVar, @@ -16,6 +17,7 @@ from typing import ( Sequence, Callable, Pattern, + Protocol, ) from numpy import ( @@ -36,8 +38,6 @@ from numpy.core.multiarray import ( unpackbits as unpackbits, ) -from typing_extensions import Protocol, Literal as L - _T = TypeVar("_T") _T_contra = TypeVar("_T_contra", contravariant=True) _T_co = TypeVar("_T_co", covariant=True) diff --git a/numpy/lib/shape_base.pyi b/numpy/lib/shape_base.pyi index cfb3040b7..4c275cc8c 100644 --- a/numpy/lib/shape_base.pyi +++ b/numpy/lib/shape_base.pyi @@ -1,5 +1,4 @@ -from typing import List, TypeVar, Callable, Sequence, Any, overload, Tuple -from typing_extensions import SupportsIndex, Protocol +from typing import List, TypeVar, Callable, Sequence, Any, overload, Tuple, SupportsIndex, Protocol from numpy import ( generic, diff --git a/numpy/lib/stride_tricks.pyi b/numpy/lib/stride_tricks.pyi index 9e4e46b8b..bafc46e9c 100644 --- a/numpy/lib/stride_tricks.pyi +++ b/numpy/lib/stride_tricks.pyi @@ -1,5 +1,4 @@ -from typing import Any, List, Dict, Iterable, TypeVar, overload -from typing_extensions import SupportsIndex +from typing import Any, List, Dict, Iterable, TypeVar, overload, SupportsIndex from numpy import dtype, generic from numpy.typing import ( diff --git a/numpy/lib/type_check.pyi b/numpy/lib/type_check.pyi index fbe325858..5eb0e62d2 100644 --- a/numpy/lib/type_check.pyi +++ b/numpy/lib/type_check.pyi @@ -1,5 +1,5 @@ -import sys from typing import ( + Literal as L, Any, Container, Iterable, @@ -7,6 +7,7 @@ from typing import ( overload, Type, TypeVar, + Protocol, ) from numpy import ( @@ -32,11 +33,6 @@ from numpy.typing import ( _DTypeLikeComplex, ) -if sys.version_info >= (3, 8): - from typing import Protocol, Literal as L -else: - from typing_extensions import Protocol, Literal as L - _T = TypeVar("_T") _T_co = TypeVar("_T_co", covariant=True) _SCT = TypeVar("_SCT", bound=generic) diff --git a/numpy/lib/utils.pyi b/numpy/lib/utils.pyi index 0518655c6..c13a219b5 100644 --- a/numpy/lib/utils.pyi +++ b/numpy/lib/utils.pyi @@ -1,4 +1,3 @@ -import sys from ast import AST from typing import ( Any, @@ -11,6 +10,7 @@ from typing import ( Tuple, TypeVar, Union, + Protocol, ) from numpy import ndarray, generic @@ -21,11 +21,6 @@ from numpy.core.numerictypes import ( issubsctype as issubsctype, ) -if sys.version_info >= (3, 8): - from typing import Protocol -else: - from typing_extensions import Protocol - _T_contra = TypeVar("_T_contra", contravariant=True) _FuncType = TypeVar("_FuncType", bound=Callable[..., Any]) diff --git a/numpy/random/_generator.pyi b/numpy/random/_generator.pyi index 14dc55131..64b683d7c 100644 --- a/numpy/random/_generator.pyi +++ b/numpy/random/_generator.pyi @@ -1,5 +1,4 @@ -import sys -from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload, TypeVar +from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload, TypeVar, Literal from numpy import ( bool_, @@ -44,11 +43,6 @@ from numpy.typing import ( _UIntCodes, ) -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - _ArrayType = TypeVar("_ArrayType", bound=ndarray[Any, Any]) _DTypeLikeFloat32 = Union[ diff --git a/numpy/random/_mt19937.pyi b/numpy/random/_mt19937.pyi index 1b8bacdae..820f27392 100644 --- a/numpy/random/_mt19937.pyi +++ b/numpy/random/_mt19937.pyi @@ -1,15 +1,9 @@ -import sys -from typing import Any, Union +from typing import Any, Union, TypedDict from numpy import dtype, ndarray, uint32 from numpy.random.bit_generator import BitGenerator, SeedSequence from numpy.typing import _ArrayLikeInt_co -if sys.version_info >= (3, 8): - from typing import TypedDict -else: - from typing_extensions import TypedDict - class _MT19937Internal(TypedDict): key: ndarray[Any, dtype[uint32]] pos: int diff --git a/numpy/random/_pcg64.pyi b/numpy/random/_pcg64.pyi index 25e2fdde6..4881a987e 100644 --- a/numpy/random/_pcg64.pyi +++ b/numpy/random/_pcg64.pyi @@ -1,14 +1,8 @@ -import sys -from typing import Union +from typing import Union, TypedDict from numpy.random.bit_generator import BitGenerator, SeedSequence from numpy.typing import _ArrayLikeInt_co -if sys.version_info >= (3, 8): - from typing import TypedDict -else: - from typing_extensions import TypedDict - class _PCG64Internal(TypedDict): state: int inc: int diff --git a/numpy/random/_philox.pyi b/numpy/random/_philox.pyi index f6a5b9b9b..dd1c5e6e9 100644 --- a/numpy/random/_philox.pyi +++ b/numpy/random/_philox.pyi @@ -1,15 +1,9 @@ -import sys -from typing import Any, Union +from typing import Any, Union, TypedDict from numpy import dtype, ndarray, uint64 from numpy.random.bit_generator import BitGenerator, SeedSequence from numpy.typing import _ArrayLikeInt_co -if sys.version_info >= (3, 8): - from typing import TypedDict -else: - from typing_extensions import TypedDict - class _PhiloxInternal(TypedDict): counter: ndarray[Any, dtype[uint64]] key: ndarray[Any, dtype[uint64]] diff --git a/numpy/random/_sfc64.pyi b/numpy/random/_sfc64.pyi index 72a271c92..94d11a210 100644 --- a/numpy/random/_sfc64.pyi +++ b/numpy/random/_sfc64.pyi @@ -1,5 +1,4 @@ -import sys -from typing import Any, Union +from typing import Any, Union, TypedDict from numpy import dtype as dtype from numpy import ndarray as ndarray @@ -7,11 +6,6 @@ from numpy import uint64 from numpy.random.bit_generator import BitGenerator, SeedSequence from numpy.typing import _ArrayLikeInt_co -if sys.version_info >= (3, 8): - from typing import TypedDict -else: - from typing_extensions import TypedDict - class _SFC64Internal(TypedDict): state: ndarray[Any, dtype[uint64]] diff --git a/numpy/random/bit_generator.pyi b/numpy/random/bit_generator.pyi index 5b68dde6c..fa2f1ab12 100644 --- a/numpy/random/bit_generator.pyi +++ b/numpy/random/bit_generator.pyi @@ -1,5 +1,4 @@ import abc -import sys from threading import Lock from typing import ( Any, @@ -16,16 +15,12 @@ from typing import ( TypeVar, Union, overload, + Literal, ) from numpy import dtype, ndarray, uint32, uint64 from numpy.typing import _ArrayLikeInt_co, _ShapeLike, _SupportsDType, _UInt32Codes, _UInt64Codes -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - _T = TypeVar("_T") _DTypeLikeUint32 = Union[ diff --git a/numpy/random/mtrand.pyi b/numpy/random/mtrand.pyi index 3137b0a95..cbe87a299 100644 --- a/numpy/random/mtrand.pyi +++ b/numpy/random/mtrand.pyi @@ -1,5 +1,4 @@ -import sys -from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload +from typing import Any, Callable, Dict, Optional, Tuple, Type, Union, overload, Literal from numpy import ( bool_, @@ -44,11 +43,6 @@ from numpy.typing import ( _UIntCodes, ) -if sys.version_info >= (3, 8): - from typing import Literal -else: - from typing_extensions import Literal - _DTypeLikeFloat32 = Union[ dtype[float32], _SupportsDType[dtype[float32]], diff --git a/numpy/testing/_private/utils.pyi b/numpy/testing/_private/utils.pyi index 29915309f..ab5ca8784 100644 --- a/numpy/testing/_private/utils.pyi +++ b/numpy/testing/_private/utils.pyi @@ -6,6 +6,7 @@ import warnings import unittest import contextlib from typing import ( + Literal as L, Any, AnyStr, Callable, @@ -23,6 +24,8 @@ from typing import ( type_check_only, TypeVar, Union, + Final, + SupportsIndex, ) from numpy import generic, dtype, number, object_, bool_, _FloatValue @@ -40,11 +43,6 @@ from unittest.case import ( SkipTest as SkipTest, ) -if sys.version_info >= (3, 8): - from typing import Final, SupportsIndex, Literal as L -else: - from typing_extensions import Final, SupportsIndex, Literal as L - _T = TypeVar("_T") _ET = TypeVar("_ET", bound=BaseException) _FT = TypeVar("_FT", bound=Callable[..., Any]) diff --git a/numpy/typing/__init__.py b/numpy/typing/__init__.py index d731f00ef..d60ddb5bb 100644 --- a/numpy/typing/__init__.py +++ b/numpy/typing/__init__.py @@ -5,13 +5,6 @@ Typing (:mod:`numpy.typing`) .. versionadded:: 1.20 -.. warning:: - - Some of the types in this module rely on features only present in - the standard library in Python 3.8 and greater. If you want to use - these types in earlier versions of Python, you should install the - typing-extensions_ package. - Large parts of the NumPy API have PEP-484-style type annotations. In addition a number of type aliases are available to users, most prominently the two below: @@ -143,24 +136,7 @@ API # NOTE: The API section will be appended with additional entries # further down in this file -from typing import TYPE_CHECKING, List, Any - -if TYPE_CHECKING: - # typing_extensions is always available when type-checking - from typing_extensions import Literal as L - _HAS_TYPING_EXTENSIONS: L[True] -else: - try: - import typing_extensions - except ImportError: - _HAS_TYPING_EXTENSIONS = False - else: - _HAS_TYPING_EXTENSIONS = True - -if TYPE_CHECKING: - from typing_extensions import final -else: - def final(f): return f +from typing import TYPE_CHECKING, List, Any, final if not TYPE_CHECKING: __all__ = ["ArrayLike", "DTypeLike", "NBitBase", "NDArray"] diff --git a/numpy/typing/_array_like.py b/numpy/typing/_array_like.py index c562f3c1f..6ea0eb662 100644 --- a/numpy/typing/_array_like.py +++ b/numpy/typing/_array_like.py @@ -1,7 +1,6 @@ from __future__ import annotations -import sys -from typing import Any, Sequence, TYPE_CHECKING, Union, TypeVar, Generic +from typing import Any, Sequence, Protocol, Union, TypeVar from numpy import ( ndarray, dtype, @@ -19,28 +18,19 @@ from numpy import ( str_, bytes_, ) -from . import _HAS_TYPING_EXTENSIONS - -if sys.version_info >= (3, 8): - from typing import Protocol -elif _HAS_TYPING_EXTENSIONS: - from typing_extensions import Protocol _T = TypeVar("_T") _ScalarType = TypeVar("_ScalarType", bound=generic) _DType = TypeVar("_DType", bound="dtype[Any]") _DType_co = TypeVar("_DType_co", covariant=True, bound="dtype[Any]") -if TYPE_CHECKING or _HAS_TYPING_EXTENSIONS or sys.version_info >= (3, 8): - # The `_SupportsArray` protocol only cares about the default dtype - # (i.e. `dtype=None` or no `dtype` parameter at all) of the to-be returned - # array. - # Concrete implementations of the protocol are responsible for adding - # any and all remaining overloads - class _SupportsArray(Protocol[_DType_co]): - def __array__(self) -> ndarray[Any, _DType_co]: ... -else: - class _SupportsArray(Generic[_DType_co]): ... +# The `_SupportsArray` protocol only cares about the default dtype +# (i.e. `dtype=None` or no `dtype` parameter at all) of the to-be returned +# array. +# Concrete implementations of the protocol are responsible for adding +# any and all remaining overloads +class _SupportsArray(Protocol[_DType_co]): + def __array__(self) -> ndarray[Any, _DType_co]: ... # TODO: Wait for support for recursive types _NestedSequence = Union[ diff --git a/numpy/typing/_callable.py b/numpy/typing/_callable.py index 8f911da3b..63a8153af 100644 --- a/numpy/typing/_callable.py +++ b/numpy/typing/_callable.py @@ -10,7 +10,6 @@ See the `Mypy documentation`_ on protocols for more details. from __future__ import annotations -import sys from typing import ( Union, TypeVar, @@ -18,7 +17,7 @@ from typing import ( Any, Tuple, NoReturn, - TYPE_CHECKING, + Protocol, ) from numpy import ( @@ -45,312 +44,282 @@ from ._scalars import ( _FloatLike_co, _NumberLike_co, ) -from . import NBitBase, _HAS_TYPING_EXTENSIONS +from . import NBitBase from ._generic_alias import NDArray -if sys.version_info >= (3, 8): - from typing import Protocol -elif _HAS_TYPING_EXTENSIONS: - from typing_extensions import Protocol - -if TYPE_CHECKING or _HAS_TYPING_EXTENSIONS or sys.version_info >= (3, 8): - _T1 = TypeVar("_T1") - _T2 = TypeVar("_T2") - _2Tuple = Tuple[_T1, _T1] - - _NBit1 = TypeVar("_NBit1", bound=NBitBase) - _NBit2 = TypeVar("_NBit2", bound=NBitBase) - - _IntType = TypeVar("_IntType", bound=integer) - _FloatType = TypeVar("_FloatType", bound=floating) - _NumberType = TypeVar("_NumberType", bound=number) - _NumberType_co = TypeVar("_NumberType_co", covariant=True, bound=number) - _GenericType_co = TypeVar("_GenericType_co", covariant=True, bound=generic) - - class _BoolOp(Protocol[_GenericType_co]): - @overload - def __call__(self, __other: _BoolLike_co) -> _GenericType_co: ... - @overload # platform dependent - def __call__(self, __other: int) -> int_: ... - @overload - def __call__(self, __other: float) -> float64: ... - @overload - def __call__(self, __other: complex) -> complex128: ... - @overload - def __call__(self, __other: _NumberType) -> _NumberType: ... - - class _BoolBitOp(Protocol[_GenericType_co]): - @overload - def __call__(self, __other: _BoolLike_co) -> _GenericType_co: ... - @overload # platform dependent - def __call__(self, __other: int) -> int_: ... - @overload - def __call__(self, __other: _IntType) -> _IntType: ... - - class _BoolSub(Protocol): - # Note that `__other: bool_` is absent here - @overload - def __call__(self, __other: bool) -> NoReturn: ... - @overload # platform dependent - def __call__(self, __other: int) -> int_: ... - @overload - def __call__(self, __other: float) -> float64: ... - @overload - def __call__(self, __other: complex) -> complex128: ... - @overload - def __call__(self, __other: _NumberType) -> _NumberType: ... - - class _BoolTrueDiv(Protocol): - @overload - def __call__(self, __other: float | _IntLike_co) -> float64: ... - @overload - def __call__(self, __other: complex) -> complex128: ... - @overload - def __call__(self, __other: _NumberType) -> _NumberType: ... - - class _BoolMod(Protocol): - @overload - def __call__(self, __other: _BoolLike_co) -> int8: ... - @overload # platform dependent - def __call__(self, __other: int) -> int_: ... - @overload - def __call__(self, __other: float) -> float64: ... - @overload - def __call__(self, __other: _IntType) -> _IntType: ... - @overload - def __call__(self, __other: _FloatType) -> _FloatType: ... - - class _BoolDivMod(Protocol): - @overload - def __call__(self, __other: _BoolLike_co) -> _2Tuple[int8]: ... - @overload # platform dependent - def __call__(self, __other: int) -> _2Tuple[int_]: ... - @overload - def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... - @overload - def __call__(self, __other: _IntType) -> _2Tuple[_IntType]: ... - @overload - def __call__(self, __other: _FloatType) -> _2Tuple[_FloatType]: ... - - class _TD64Div(Protocol[_NumberType_co]): - @overload - def __call__(self, __other: timedelta64) -> _NumberType_co: ... - @overload - def __call__(self, __other: _BoolLike_co) -> NoReturn: ... - @overload - def __call__(self, __other: _FloatLike_co) -> timedelta64: ... - - class _IntTrueDiv(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> floating[_NBit1]: ... - @overload - def __call__(self, __other: int) -> floating[_NBit1 | _NBitInt]: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: complex - ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... - @overload - def __call__(self, __other: integer[_NBit2]) -> floating[_NBit1 | _NBit2]: ... - - class _UnsignedIntOp(Protocol[_NBit1]): - # NOTE: `uint64 + signedinteger -> float64` - @overload - def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ... - @overload - def __call__( - self, __other: int | signedinteger[Any] - ) -> Any: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: complex - ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: unsignedinteger[_NBit2] - ) -> unsignedinteger[_NBit1 | _NBit2]: ... - - class _UnsignedIntBitOp(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ... - @overload - def __call__(self, __other: int) -> signedinteger[Any]: ... - @overload - def __call__(self, __other: signedinteger[Any]) -> signedinteger[Any]: ... - @overload - def __call__( - self, __other: unsignedinteger[_NBit2] - ) -> unsignedinteger[_NBit1 | _NBit2]: ... - - class _UnsignedIntMod(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ... - @overload - def __call__( - self, __other: int | signedinteger[Any] - ) -> Any: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: unsignedinteger[_NBit2] - ) -> unsignedinteger[_NBit1 | _NBit2]: ... - - class _UnsignedIntDivMod(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> _2Tuple[signedinteger[_NBit1]]: ... - @overload - def __call__( - self, __other: int | signedinteger[Any] - ) -> _2Tuple[Any]: ... - @overload - def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... - @overload - def __call__( - self, __other: unsignedinteger[_NBit2] - ) -> _2Tuple[unsignedinteger[_NBit1 | _NBit2]]: ... - - class _SignedIntOp(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> signedinteger[_NBit1]: ... - @overload - def __call__(self, __other: int) -> signedinteger[_NBit1 | _NBitInt]: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: complex - ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: signedinteger[_NBit2] - ) -> signedinteger[_NBit1 | _NBit2]: ... - - class _SignedIntBitOp(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> signedinteger[_NBit1]: ... - @overload - def __call__(self, __other: int) -> signedinteger[_NBit1 | _NBitInt]: ... - @overload - def __call__( - self, __other: signedinteger[_NBit2] - ) -> signedinteger[_NBit1 | _NBit2]: ... - - class _SignedIntMod(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> signedinteger[_NBit1]: ... - @overload - def __call__(self, __other: int) -> signedinteger[_NBit1 | _NBitInt]: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: signedinteger[_NBit2] - ) -> signedinteger[_NBit1 | _NBit2]: ... - - class _SignedIntDivMod(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> _2Tuple[signedinteger[_NBit1]]: ... - @overload - def __call__(self, __other: int) -> _2Tuple[signedinteger[_NBit1 | _NBitInt]]: ... - @overload - def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... - @overload - def __call__( - self, __other: signedinteger[_NBit2] - ) -> _2Tuple[signedinteger[_NBit1 | _NBit2]]: ... - - class _FloatOp(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> floating[_NBit1]: ... - @overload - def __call__(self, __other: int) -> floating[_NBit1 | _NBitInt]: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: complex - ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: integer[_NBit2] | floating[_NBit2] - ) -> floating[_NBit1 | _NBit2]: ... - - class _FloatMod(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> floating[_NBit1]: ... - @overload - def __call__(self, __other: int) -> floating[_NBit1 | _NBitInt]: ... - @overload - def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, __other: integer[_NBit2] | floating[_NBit2] - ) -> floating[_NBit1 | _NBit2]: ... - - class _FloatDivMod(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> _2Tuple[floating[_NBit1]]: ... - @overload - def __call__(self, __other: int) -> _2Tuple[floating[_NBit1 | _NBitInt]]: ... - @overload - def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... - @overload - def __call__( - self, __other: integer[_NBit2] | floating[_NBit2] - ) -> _2Tuple[floating[_NBit1 | _NBit2]]: ... - - class _ComplexOp(Protocol[_NBit1]): - @overload - def __call__(self, __other: bool) -> complexfloating[_NBit1, _NBit1]: ... - @overload - def __call__(self, __other: int) -> complexfloating[_NBit1 | _NBitInt, _NBit1 | _NBitInt]: ... - @overload - def __call__( - self, __other: complex - ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... - @overload - def __call__( - self, - __other: Union[ - integer[_NBit2], - floating[_NBit2], - complexfloating[_NBit2, _NBit2], - ] - ) -> complexfloating[_NBit1 | _NBit2, _NBit1 | _NBit2]: ... - - class _NumberOp(Protocol): - def __call__(self, __other: _NumberLike_co) -> Any: ... - - class _ComparisonOp(Protocol[_T1, _T2]): - @overload - def __call__(self, __other: _T1) -> bool_: ... - @overload - def __call__(self, __other: _T2) -> NDArray[bool_]: ... - -else: - _BoolOp = Any - _BoolBitOp = Any - _BoolSub = Any - _BoolTrueDiv = Any - _BoolMod = Any - _BoolDivMod = Any - _TD64Div = Any - _IntTrueDiv = Any - _UnsignedIntOp = Any - _UnsignedIntBitOp = Any - _UnsignedIntMod = Any - _UnsignedIntDivMod = Any - _SignedIntOp = Any - _SignedIntBitOp = Any - _SignedIntMod = Any - _SignedIntDivMod = Any - _FloatOp = Any - _FloatMod = Any - _FloatDivMod = Any - _ComplexOp = Any - _NumberOp = Any - _ComparisonOp = Any +_T1 = TypeVar("_T1") +_T2 = TypeVar("_T2") +_2Tuple = Tuple[_T1, _T1] + +_NBit1 = TypeVar("_NBit1", bound=NBitBase) +_NBit2 = TypeVar("_NBit2", bound=NBitBase) + +_IntType = TypeVar("_IntType", bound=integer) +_FloatType = TypeVar("_FloatType", bound=floating) +_NumberType = TypeVar("_NumberType", bound=number) +_NumberType_co = TypeVar("_NumberType_co", covariant=True, bound=number) +_GenericType_co = TypeVar("_GenericType_co", covariant=True, bound=generic) + +class _BoolOp(Protocol[_GenericType_co]): + @overload + def __call__(self, __other: _BoolLike_co) -> _GenericType_co: ... + @overload # platform dependent + def __call__(self, __other: int) -> int_: ... + @overload + def __call__(self, __other: float) -> float64: ... + @overload + def __call__(self, __other: complex) -> complex128: ... + @overload + def __call__(self, __other: _NumberType) -> _NumberType: ... + +class _BoolBitOp(Protocol[_GenericType_co]): + @overload + def __call__(self, __other: _BoolLike_co) -> _GenericType_co: ... + @overload # platform dependent + def __call__(self, __other: int) -> int_: ... + @overload + def __call__(self, __other: _IntType) -> _IntType: ... + +class _BoolSub(Protocol): + # Note that `__other: bool_` is absent here + @overload + def __call__(self, __other: bool) -> NoReturn: ... + @overload # platform dependent + def __call__(self, __other: int) -> int_: ... + @overload + def __call__(self, __other: float) -> float64: ... + @overload + def __call__(self, __other: complex) -> complex128: ... + @overload + def __call__(self, __other: _NumberType) -> _NumberType: ... + +class _BoolTrueDiv(Protocol): + @overload + def __call__(self, __other: float | _IntLike_co) -> float64: ... + @overload + def __call__(self, __other: complex) -> complex128: ... + @overload + def __call__(self, __other: _NumberType) -> _NumberType: ... + +class _BoolMod(Protocol): + @overload + def __call__(self, __other: _BoolLike_co) -> int8: ... + @overload # platform dependent + def __call__(self, __other: int) -> int_: ... + @overload + def __call__(self, __other: float) -> float64: ... + @overload + def __call__(self, __other: _IntType) -> _IntType: ... + @overload + def __call__(self, __other: _FloatType) -> _FloatType: ... + +class _BoolDivMod(Protocol): + @overload + def __call__(self, __other: _BoolLike_co) -> _2Tuple[int8]: ... + @overload # platform dependent + def __call__(self, __other: int) -> _2Tuple[int_]: ... + @overload + def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... + @overload + def __call__(self, __other: _IntType) -> _2Tuple[_IntType]: ... + @overload + def __call__(self, __other: _FloatType) -> _2Tuple[_FloatType]: ... + +class _TD64Div(Protocol[_NumberType_co]): + @overload + def __call__(self, __other: timedelta64) -> _NumberType_co: ... + @overload + def __call__(self, __other: _BoolLike_co) -> NoReturn: ... + @overload + def __call__(self, __other: _FloatLike_co) -> timedelta64: ... + +class _IntTrueDiv(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> floating[_NBit1]: ... + @overload + def __call__(self, __other: int) -> floating[_NBit1 | _NBitInt]: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: complex + ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... + @overload + def __call__(self, __other: integer[_NBit2]) -> floating[_NBit1 | _NBit2]: ... + +class _UnsignedIntOp(Protocol[_NBit1]): + # NOTE: `uint64 + signedinteger -> float64` + @overload + def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ... + @overload + def __call__( + self, __other: int | signedinteger[Any] + ) -> Any: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: complex + ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: unsignedinteger[_NBit2] + ) -> unsignedinteger[_NBit1 | _NBit2]: ... + +class _UnsignedIntBitOp(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ... + @overload + def __call__(self, __other: int) -> signedinteger[Any]: ... + @overload + def __call__(self, __other: signedinteger[Any]) -> signedinteger[Any]: ... + @overload + def __call__( + self, __other: unsignedinteger[_NBit2] + ) -> unsignedinteger[_NBit1 | _NBit2]: ... + +class _UnsignedIntMod(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> unsignedinteger[_NBit1]: ... + @overload + def __call__( + self, __other: int | signedinteger[Any] + ) -> Any: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: unsignedinteger[_NBit2] + ) -> unsignedinteger[_NBit1 | _NBit2]: ... + +class _UnsignedIntDivMod(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> _2Tuple[signedinteger[_NBit1]]: ... + @overload + def __call__( + self, __other: int | signedinteger[Any] + ) -> _2Tuple[Any]: ... + @overload + def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... + @overload + def __call__( + self, __other: unsignedinteger[_NBit2] + ) -> _2Tuple[unsignedinteger[_NBit1 | _NBit2]]: ... + +class _SignedIntOp(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> signedinteger[_NBit1]: ... + @overload + def __call__(self, __other: int) -> signedinteger[_NBit1 | _NBitInt]: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: complex + ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: signedinteger[_NBit2] + ) -> signedinteger[_NBit1 | _NBit2]: ... + +class _SignedIntBitOp(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> signedinteger[_NBit1]: ... + @overload + def __call__(self, __other: int) -> signedinteger[_NBit1 | _NBitInt]: ... + @overload + def __call__( + self, __other: signedinteger[_NBit2] + ) -> signedinteger[_NBit1 | _NBit2]: ... + +class _SignedIntMod(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> signedinteger[_NBit1]: ... + @overload + def __call__(self, __other: int) -> signedinteger[_NBit1 | _NBitInt]: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: signedinteger[_NBit2] + ) -> signedinteger[_NBit1 | _NBit2]: ... + +class _SignedIntDivMod(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> _2Tuple[signedinteger[_NBit1]]: ... + @overload + def __call__(self, __other: int) -> _2Tuple[signedinteger[_NBit1 | _NBitInt]]: ... + @overload + def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... + @overload + def __call__( + self, __other: signedinteger[_NBit2] + ) -> _2Tuple[signedinteger[_NBit1 | _NBit2]]: ... + +class _FloatOp(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> floating[_NBit1]: ... + @overload + def __call__(self, __other: int) -> floating[_NBit1 | _NBitInt]: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: complex + ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: integer[_NBit2] | floating[_NBit2] + ) -> floating[_NBit1 | _NBit2]: ... + +class _FloatMod(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> floating[_NBit1]: ... + @overload + def __call__(self, __other: int) -> floating[_NBit1 | _NBitInt]: ... + @overload + def __call__(self, __other: float) -> floating[_NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, __other: integer[_NBit2] | floating[_NBit2] + ) -> floating[_NBit1 | _NBit2]: ... + +class _FloatDivMod(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> _2Tuple[floating[_NBit1]]: ... + @overload + def __call__(self, __other: int) -> _2Tuple[floating[_NBit1 | _NBitInt]]: ... + @overload + def __call__(self, __other: float) -> _2Tuple[floating[_NBit1 | _NBitDouble]]: ... + @overload + def __call__( + self, __other: integer[_NBit2] | floating[_NBit2] + ) -> _2Tuple[floating[_NBit1 | _NBit2]]: ... + +class _ComplexOp(Protocol[_NBit1]): + @overload + def __call__(self, __other: bool) -> complexfloating[_NBit1, _NBit1]: ... + @overload + def __call__(self, __other: int) -> complexfloating[_NBit1 | _NBitInt, _NBit1 | _NBitInt]: ... + @overload + def __call__( + self, __other: complex + ) -> complexfloating[_NBit1 | _NBitDouble, _NBit1 | _NBitDouble]: ... + @overload + def __call__( + self, + __other: Union[ + integer[_NBit2], + floating[_NBit2], + complexfloating[_NBit2, _NBit2], + ] + ) -> complexfloating[_NBit1 | _NBit2, _NBit1 | _NBit2]: ... + +class _NumberOp(Protocol): + def __call__(self, __other: _NumberLike_co) -> Any: ... + +class _ComparisonOp(Protocol[_T1, _T2]): + @overload + def __call__(self, __other: _T1) -> bool_: ... + @overload + def __call__(self, __other: _T2) -> NDArray[bool_]: ... diff --git a/numpy/typing/_char_codes.py b/numpy/typing/_char_codes.py index 22ee168e9..139471084 100644 --- a/numpy/typing/_char_codes.py +++ b/numpy/typing/_char_codes.py @@ -1,171 +1,111 @@ -import sys -from typing import Any, TYPE_CHECKING - -from . import _HAS_TYPING_EXTENSIONS - -if sys.version_info >= (3, 8): - from typing import Literal -elif _HAS_TYPING_EXTENSIONS: - from typing_extensions import Literal - -if TYPE_CHECKING or _HAS_TYPING_EXTENSIONS or sys.version_info >= (3, 8): - _BoolCodes = Literal["?", "=?", "<?", ">?", "bool", "bool_", "bool8"] - - _UInt8Codes = Literal["uint8", "u1", "=u1", "<u1", ">u1"] - _UInt16Codes = Literal["uint16", "u2", "=u2", "<u2", ">u2"] - _UInt32Codes = Literal["uint32", "u4", "=u4", "<u4", ">u4"] - _UInt64Codes = Literal["uint64", "u8", "=u8", "<u8", ">u8"] - - _Int8Codes = Literal["int8", "i1", "=i1", "<i1", ">i1"] - _Int16Codes = Literal["int16", "i2", "=i2", "<i2", ">i2"] - _Int32Codes = Literal["int32", "i4", "=i4", "<i4", ">i4"] - _Int64Codes = Literal["int64", "i8", "=i8", "<i8", ">i8"] - - _Float16Codes = Literal["float16", "f2", "=f2", "<f2", ">f2"] - _Float32Codes = Literal["float32", "f4", "=f4", "<f4", ">f4"] - _Float64Codes = Literal["float64", "f8", "=f8", "<f8", ">f8"] - - _Complex64Codes = Literal["complex64", "c8", "=c8", "<c8", ">c8"] - _Complex128Codes = Literal["complex128", "c16", "=c16", "<c16", ">c16"] - - _ByteCodes = Literal["byte", "b", "=b", "<b", ">b"] - _ShortCodes = Literal["short", "h", "=h", "<h", ">h"] - _IntCCodes = Literal["intc", "i", "=i", "<i", ">i"] - _IntPCodes = Literal["intp", "int0", "p", "=p", "<p", ">p"] - _IntCodes = Literal["long", "int", "int_", "l", "=l", "<l", ">l"] - _LongLongCodes = Literal["longlong", "q", "=q", "<q", ">q"] - - _UByteCodes = Literal["ubyte", "B", "=B", "<B", ">B"] - _UShortCodes = Literal["ushort", "H", "=H", "<H", ">H"] - _UIntCCodes = Literal["uintc", "I", "=I", "<I", ">I"] - _UIntPCodes = Literal["uintp", "uint0", "P", "=P", "<P", ">P"] - _UIntCodes = Literal["uint", "L", "=L", "<L", ">L"] - _ULongLongCodes = Literal["ulonglong", "Q", "=Q", "<Q", ">Q"] - - _HalfCodes = Literal["half", "e", "=e", "<e", ">e"] - _SingleCodes = Literal["single", "f", "=f", "<f", ">f"] - _DoubleCodes = Literal["double", "float", "float_", "d", "=d", "<d", ">d"] - _LongDoubleCodes = Literal["longdouble", "longfloat", "g", "=g", "<g", ">g"] - - _CSingleCodes = Literal["csingle", "singlecomplex", "F", "=F", "<F", ">F"] - _CDoubleCodes = Literal["cdouble", "complex", "complex_", "cfloat", "D", "=D", "<D", ">D"] - _CLongDoubleCodes = Literal["clongdouble", "clongfloat", "longcomplex", "G", "=G", "<G", ">G"] - - _StrCodes = Literal["str", "str_", "str0", "unicode", "unicode_", "U", "=U", "<U", ">U"] - _BytesCodes = Literal["bytes", "bytes_", "bytes0", "S", "=S", "<S", ">S"] - _VoidCodes = Literal["void", "void0", "V", "=V", "<V", ">V"] - _ObjectCodes = Literal["object", "object_", "O", "=O", "<O", ">O"] - - _DT64Codes = Literal[ - "datetime64", "=datetime64", "<datetime64", ">datetime64", - "datetime64[Y]", "=datetime64[Y]", "<datetime64[Y]", ">datetime64[Y]", - "datetime64[M]", "=datetime64[M]", "<datetime64[M]", ">datetime64[M]", - "datetime64[W]", "=datetime64[W]", "<datetime64[W]", ">datetime64[W]", - "datetime64[D]", "=datetime64[D]", "<datetime64[D]", ">datetime64[D]", - "datetime64[h]", "=datetime64[h]", "<datetime64[h]", ">datetime64[h]", - "datetime64[m]", "=datetime64[m]", "<datetime64[m]", ">datetime64[m]", - "datetime64[s]", "=datetime64[s]", "<datetime64[s]", ">datetime64[s]", - "datetime64[ms]", "=datetime64[ms]", "<datetime64[ms]", ">datetime64[ms]", - "datetime64[us]", "=datetime64[us]", "<datetime64[us]", ">datetime64[us]", - "datetime64[ns]", "=datetime64[ns]", "<datetime64[ns]", ">datetime64[ns]", - "datetime64[ps]", "=datetime64[ps]", "<datetime64[ps]", ">datetime64[ps]", - "datetime64[fs]", "=datetime64[fs]", "<datetime64[fs]", ">datetime64[fs]", - "datetime64[as]", "=datetime64[as]", "<datetime64[as]", ">datetime64[as]", - "M", "=M", "<M", ">M", - "M8", "=M8", "<M8", ">M8", - "M8[Y]", "=M8[Y]", "<M8[Y]", ">M8[Y]", - "M8[M]", "=M8[M]", "<M8[M]", ">M8[M]", - "M8[W]", "=M8[W]", "<M8[W]", ">M8[W]", - "M8[D]", "=M8[D]", "<M8[D]", ">M8[D]", - "M8[h]", "=M8[h]", "<M8[h]", ">M8[h]", - "M8[m]", "=M8[m]", "<M8[m]", ">M8[m]", - "M8[s]", "=M8[s]", "<M8[s]", ">M8[s]", - "M8[ms]", "=M8[ms]", "<M8[ms]", ">M8[ms]", - "M8[us]", "=M8[us]", "<M8[us]", ">M8[us]", - "M8[ns]", "=M8[ns]", "<M8[ns]", ">M8[ns]", - "M8[ps]", "=M8[ps]", "<M8[ps]", ">M8[ps]", - "M8[fs]", "=M8[fs]", "<M8[fs]", ">M8[fs]", - "M8[as]", "=M8[as]", "<M8[as]", ">M8[as]", - ] - _TD64Codes = Literal[ - "timedelta64", "=timedelta64", "<timedelta64", ">timedelta64", - "timedelta64[Y]", "=timedelta64[Y]", "<timedelta64[Y]", ">timedelta64[Y]", - "timedelta64[M]", "=timedelta64[M]", "<timedelta64[M]", ">timedelta64[M]", - "timedelta64[W]", "=timedelta64[W]", "<timedelta64[W]", ">timedelta64[W]", - "timedelta64[D]", "=timedelta64[D]", "<timedelta64[D]", ">timedelta64[D]", - "timedelta64[h]", "=timedelta64[h]", "<timedelta64[h]", ">timedelta64[h]", - "timedelta64[m]", "=timedelta64[m]", "<timedelta64[m]", ">timedelta64[m]", - "timedelta64[s]", "=timedelta64[s]", "<timedelta64[s]", ">timedelta64[s]", - "timedelta64[ms]", "=timedelta64[ms]", "<timedelta64[ms]", ">timedelta64[ms]", - "timedelta64[us]", "=timedelta64[us]", "<timedelta64[us]", ">timedelta64[us]", - "timedelta64[ns]", "=timedelta64[ns]", "<timedelta64[ns]", ">timedelta64[ns]", - "timedelta64[ps]", "=timedelta64[ps]", "<timedelta64[ps]", ">timedelta64[ps]", - "timedelta64[fs]", "=timedelta64[fs]", "<timedelta64[fs]", ">timedelta64[fs]", - "timedelta64[as]", "=timedelta64[as]", "<timedelta64[as]", ">timedelta64[as]", - "m", "=m", "<m", ">m", - "m8", "=m8", "<m8", ">m8", - "m8[Y]", "=m8[Y]", "<m8[Y]", ">m8[Y]", - "m8[M]", "=m8[M]", "<m8[M]", ">m8[M]", - "m8[W]", "=m8[W]", "<m8[W]", ">m8[W]", - "m8[D]", "=m8[D]", "<m8[D]", ">m8[D]", - "m8[h]", "=m8[h]", "<m8[h]", ">m8[h]", - "m8[m]", "=m8[m]", "<m8[m]", ">m8[m]", - "m8[s]", "=m8[s]", "<m8[s]", ">m8[s]", - "m8[ms]", "=m8[ms]", "<m8[ms]", ">m8[ms]", - "m8[us]", "=m8[us]", "<m8[us]", ">m8[us]", - "m8[ns]", "=m8[ns]", "<m8[ns]", ">m8[ns]", - "m8[ps]", "=m8[ps]", "<m8[ps]", ">m8[ps]", - "m8[fs]", "=m8[fs]", "<m8[fs]", ">m8[fs]", - "m8[as]", "=m8[as]", "<m8[as]", ">m8[as]", - ] - -else: - _BoolCodes = Any - - _UInt8Codes = Any - _UInt16Codes = Any - _UInt32Codes = Any - _UInt64Codes = Any - - _Int8Codes = Any - _Int16Codes = Any - _Int32Codes = Any - _Int64Codes = Any - - _Float16Codes = Any - _Float32Codes = Any - _Float64Codes = Any - - _Complex64Codes = Any - _Complex128Codes = Any - - _ByteCodes = Any - _ShortCodes = Any - _IntCCodes = Any - _IntPCodes = Any - _IntCodes = Any - _LongLongCodes = Any - - _UByteCodes = Any - _UShortCodes = Any - _UIntCCodes = Any - _UIntPCodes = Any - _UIntCodes = Any - _ULongLongCodes = Any - - _HalfCodes = Any - _SingleCodes = Any - _DoubleCodes = Any - _LongDoubleCodes = Any - - _CSingleCodes = Any - _CDoubleCodes = Any - _CLongDoubleCodes = Any - - _StrCodes = Any - _BytesCodes = Any - _VoidCodes = Any - _ObjectCodes = Any - - _DT64Codes = Any - _TD64Codes = Any +from typing import Literal + +_BoolCodes = Literal["?", "=?", "<?", ">?", "bool", "bool_", "bool8"] + +_UInt8Codes = Literal["uint8", "u1", "=u1", "<u1", ">u1"] +_UInt16Codes = Literal["uint16", "u2", "=u2", "<u2", ">u2"] +_UInt32Codes = Literal["uint32", "u4", "=u4", "<u4", ">u4"] +_UInt64Codes = Literal["uint64", "u8", "=u8", "<u8", ">u8"] + +_Int8Codes = Literal["int8", "i1", "=i1", "<i1", ">i1"] +_Int16Codes = Literal["int16", "i2", "=i2", "<i2", ">i2"] +_Int32Codes = Literal["int32", "i4", "=i4", "<i4", ">i4"] +_Int64Codes = Literal["int64", "i8", "=i8", "<i8", ">i8"] + +_Float16Codes = Literal["float16", "f2", "=f2", "<f2", ">f2"] +_Float32Codes = Literal["float32", "f4", "=f4", "<f4", ">f4"] +_Float64Codes = Literal["float64", "f8", "=f8", "<f8", ">f8"] + +_Complex64Codes = Literal["complex64", "c8", "=c8", "<c8", ">c8"] +_Complex128Codes = Literal["complex128", "c16", "=c16", "<c16", ">c16"] + +_ByteCodes = Literal["byte", "b", "=b", "<b", ">b"] +_ShortCodes = Literal["short", "h", "=h", "<h", ">h"] +_IntCCodes = Literal["intc", "i", "=i", "<i", ">i"] +_IntPCodes = Literal["intp", "int0", "p", "=p", "<p", ">p"] +_IntCodes = Literal["long", "int", "int_", "l", "=l", "<l", ">l"] +_LongLongCodes = Literal["longlong", "q", "=q", "<q", ">q"] + +_UByteCodes = Literal["ubyte", "B", "=B", "<B", ">B"] +_UShortCodes = Literal["ushort", "H", "=H", "<H", ">H"] +_UIntCCodes = Literal["uintc", "I", "=I", "<I", ">I"] +_UIntPCodes = Literal["uintp", "uint0", "P", "=P", "<P", ">P"] +_UIntCodes = Literal["uint", "L", "=L", "<L", ">L"] +_ULongLongCodes = Literal["ulonglong", "Q", "=Q", "<Q", ">Q"] + +_HalfCodes = Literal["half", "e", "=e", "<e", ">e"] +_SingleCodes = Literal["single", "f", "=f", "<f", ">f"] +_DoubleCodes = Literal["double", "float", "float_", "d", "=d", "<d", ">d"] +_LongDoubleCodes = Literal["longdouble", "longfloat", "g", "=g", "<g", ">g"] + +_CSingleCodes = Literal["csingle", "singlecomplex", "F", "=F", "<F", ">F"] +_CDoubleCodes = Literal["cdouble", "complex", "complex_", "cfloat", "D", "=D", "<D", ">D"] +_CLongDoubleCodes = Literal["clongdouble", "clongfloat", "longcomplex", "G", "=G", "<G", ">G"] + +_StrCodes = Literal["str", "str_", "str0", "unicode", "unicode_", "U", "=U", "<U", ">U"] +_BytesCodes = Literal["bytes", "bytes_", "bytes0", "S", "=S", "<S", ">S"] +_VoidCodes = Literal["void", "void0", "V", "=V", "<V", ">V"] +_ObjectCodes = Literal["object", "object_", "O", "=O", "<O", ">O"] + +_DT64Codes = Literal[ + "datetime64", "=datetime64", "<datetime64", ">datetime64", + "datetime64[Y]", "=datetime64[Y]", "<datetime64[Y]", ">datetime64[Y]", + "datetime64[M]", "=datetime64[M]", "<datetime64[M]", ">datetime64[M]", + "datetime64[W]", "=datetime64[W]", "<datetime64[W]", ">datetime64[W]", + "datetime64[D]", "=datetime64[D]", "<datetime64[D]", ">datetime64[D]", + "datetime64[h]", "=datetime64[h]", "<datetime64[h]", ">datetime64[h]", + "datetime64[m]", "=datetime64[m]", "<datetime64[m]", ">datetime64[m]", + "datetime64[s]", "=datetime64[s]", "<datetime64[s]", ">datetime64[s]", + "datetime64[ms]", "=datetime64[ms]", "<datetime64[ms]", ">datetime64[ms]", + "datetime64[us]", "=datetime64[us]", "<datetime64[us]", ">datetime64[us]", + "datetime64[ns]", "=datetime64[ns]", "<datetime64[ns]", ">datetime64[ns]", + "datetime64[ps]", "=datetime64[ps]", "<datetime64[ps]", ">datetime64[ps]", + "datetime64[fs]", "=datetime64[fs]", "<datetime64[fs]", ">datetime64[fs]", + "datetime64[as]", "=datetime64[as]", "<datetime64[as]", ">datetime64[as]", + "M", "=M", "<M", ">M", + "M8", "=M8", "<M8", ">M8", + "M8[Y]", "=M8[Y]", "<M8[Y]", ">M8[Y]", + "M8[M]", "=M8[M]", "<M8[M]", ">M8[M]", + "M8[W]", "=M8[W]", "<M8[W]", ">M8[W]", + "M8[D]", "=M8[D]", "<M8[D]", ">M8[D]", + "M8[h]", "=M8[h]", "<M8[h]", ">M8[h]", + "M8[m]", "=M8[m]", "<M8[m]", ">M8[m]", + "M8[s]", "=M8[s]", "<M8[s]", ">M8[s]", + "M8[ms]", "=M8[ms]", "<M8[ms]", ">M8[ms]", + "M8[us]", "=M8[us]", "<M8[us]", ">M8[us]", + "M8[ns]", "=M8[ns]", "<M8[ns]", ">M8[ns]", + "M8[ps]", "=M8[ps]", "<M8[ps]", ">M8[ps]", + "M8[fs]", "=M8[fs]", "<M8[fs]", ">M8[fs]", + "M8[as]", "=M8[as]", "<M8[as]", ">M8[as]", +] +_TD64Codes = Literal[ + "timedelta64", "=timedelta64", "<timedelta64", ">timedelta64", + "timedelta64[Y]", "=timedelta64[Y]", "<timedelta64[Y]", ">timedelta64[Y]", + "timedelta64[M]", "=timedelta64[M]", "<timedelta64[M]", ">timedelta64[M]", + "timedelta64[W]", "=timedelta64[W]", "<timedelta64[W]", ">timedelta64[W]", + "timedelta64[D]", "=timedelta64[D]", "<timedelta64[D]", ">timedelta64[D]", + "timedelta64[h]", "=timedelta64[h]", "<timedelta64[h]", ">timedelta64[h]", + "timedelta64[m]", "=timedelta64[m]", "<timedelta64[m]", ">timedelta64[m]", + "timedelta64[s]", "=timedelta64[s]", "<timedelta64[s]", ">timedelta64[s]", + "timedelta64[ms]", "=timedelta64[ms]", "<timedelta64[ms]", ">timedelta64[ms]", + "timedelta64[us]", "=timedelta64[us]", "<timedelta64[us]", ">timedelta64[us]", + "timedelta64[ns]", "=timedelta64[ns]", "<timedelta64[ns]", ">timedelta64[ns]", + "timedelta64[ps]", "=timedelta64[ps]", "<timedelta64[ps]", ">timedelta64[ps]", + "timedelta64[fs]", "=timedelta64[fs]", "<timedelta64[fs]", ">timedelta64[fs]", + "timedelta64[as]", "=timedelta64[as]", "<timedelta64[as]", ">timedelta64[as]", + "m", "=m", "<m", ">m", + "m8", "=m8", "<m8", ">m8", + "m8[Y]", "=m8[Y]", "<m8[Y]", ">m8[Y]", + "m8[M]", "=m8[M]", "<m8[M]", ">m8[M]", + "m8[W]", "=m8[W]", "<m8[W]", ">m8[W]", + "m8[D]", "=m8[D]", "<m8[D]", ">m8[D]", + "m8[h]", "=m8[h]", "<m8[h]", ">m8[h]", + "m8[m]", "=m8[m]", "<m8[m]", ">m8[m]", + "m8[s]", "=m8[s]", "<m8[s]", ">m8[s]", + "m8[ms]", "=m8[ms]", "<m8[ms]", ">m8[ms]", + "m8[us]", "=m8[us]", "<m8[us]", ">m8[us]", + "m8[ns]", "=m8[ns]", "<m8[ns]", ">m8[ns]", + "m8[ps]", "=m8[ps]", "<m8[ps]", ">m8[ps]", + "m8[fs]", "=m8[fs]", "<m8[fs]", ">m8[fs]", + "m8[as]", "=m8[as]", "<m8[as]", ">m8[as]", +] diff --git a/numpy/typing/_dtype_like.py b/numpy/typing/_dtype_like.py index b2ce3adb4..0955f5b18 100644 --- a/numpy/typing/_dtype_like.py +++ b/numpy/typing/_dtype_like.py @@ -1,19 +1,10 @@ -import sys -from typing import Any, List, Sequence, Tuple, Union, Type, TypeVar, TYPE_CHECKING +from typing import Any, List, Sequence, Tuple, Union, Type, TypeVar, Protocol, TypedDict import numpy as np -from . import _HAS_TYPING_EXTENSIONS from ._shape import _ShapeLike from ._generic_alias import _DType as DType -if sys.version_info >= (3, 8): - from typing import Protocol, TypedDict -elif _HAS_TYPING_EXTENSIONS: - from typing_extensions import Protocol, TypedDict -else: - from ._generic_alias import _GenericAlias as GenericAlias - from ._char_codes import ( _BoolCodes, _UInt8Codes, @@ -59,30 +50,22 @@ from ._char_codes import ( _DTypeLikeNested = Any # TODO: wait for support for recursive types _DType_co = TypeVar("_DType_co", covariant=True, bound=DType[Any]) -if TYPE_CHECKING or _HAS_TYPING_EXTENSIONS or sys.version_info >= (3, 8): - # Mandatory keys - class _DTypeDictBase(TypedDict): - names: Sequence[str] - formats: Sequence[_DTypeLikeNested] - - # Mandatory + optional keys - class _DTypeDict(_DTypeDictBase, total=False): - offsets: Sequence[int] - titles: Sequence[Any] # Only `str` elements are usable as indexing aliases, but all objects are legal - itemsize: int - aligned: bool - - # A protocol for anything with the dtype attribute - class _SupportsDType(Protocol[_DType_co]): - @property - def dtype(self) -> _DType_co: ... - -else: - _DTypeDict = Any - - class _SupportsDType: ... - _SupportsDType = GenericAlias(_SupportsDType, _DType_co) - +# Mandatory keys +class _DTypeDictBase(TypedDict): + names: Sequence[str] + formats: Sequence[_DTypeLikeNested] + +# Mandatory + optional keys +class _DTypeDict(_DTypeDictBase, total=False): + offsets: Sequence[int] + titles: Sequence[Any] # Only `str` elements are usable as indexing aliases, but all objects are legal + itemsize: int + aligned: bool + +# A protocol for anything with the dtype attribute +class _SupportsDType(Protocol[_DType_co]): + @property + def dtype(self) -> _DType_co: ... # Would create a dtype[np.void] _VoidDTypeLike = Union[ diff --git a/numpy/typing/_shape.py b/numpy/typing/_shape.py index 75698f3d3..c28859b19 100644 --- a/numpy/typing/_shape.py +++ b/numpy/typing/_shape.py @@ -1,14 +1,4 @@ -import sys -from typing import Sequence, Tuple, Union, Any - -from . import _HAS_TYPING_EXTENSIONS - -if sys.version_info >= (3, 8): - from typing import SupportsIndex -elif _HAS_TYPING_EXTENSIONS: - from typing_extensions import SupportsIndex -else: - SupportsIndex = Any +from typing import Sequence, Tuple, Union, SupportsIndex _Shape = Tuple[int, ...] diff --git a/numpy/typing/_ufunc.pyi b/numpy/typing/_ufunc.pyi index be1e654c2..37e6c008f 100644 --- a/numpy/typing/_ufunc.pyi +++ b/numpy/typing/_ufunc.pyi @@ -14,6 +14,8 @@ from typing import ( overload, Tuple, TypeVar, + Literal, + SupportsIndex, ) from numpy import ufunc, _CastingKind, _OrderKACF @@ -24,8 +26,6 @@ from ._scalars import _ScalarLike_co from ._array_like import ArrayLike, _ArrayLikeBool_co, _ArrayLikeInt_co from ._dtype_like import DTypeLike -from typing_extensions import Literal, SupportsIndex - _T = TypeVar("_T") _2Tuple = Tuple[_T, _T] _3Tuple = Tuple[_T, _T, _T] diff --git a/numpy/typing/tests/data/reveal/arraypad.py b/numpy/typing/tests/data/reveal/arraypad.py index ba5577ee0..03c03fb4e 100644 --- a/numpy/typing/tests/data/reveal/arraypad.py +++ b/numpy/typing/tests/data/reveal/arraypad.py @@ -1,5 +1,4 @@ -from typing import List, Any, Mapping, Tuple -from typing_extensions import SupportsIndex +from typing import List, Any, Mapping, Tuple, SupportsIndex import numpy as np import numpy.typing as npt diff --git a/numpy/typing/tests/test_runtime.py b/numpy/typing/tests/test_runtime.py index e82b08ac2..151b06bed 100644 --- a/numpy/typing/tests/test_runtime.py +++ b/numpy/typing/tests/test_runtime.py @@ -3,18 +3,12 @@ from __future__ import annotations import sys -from typing import get_type_hints, Union, Tuple, NamedTuple +from typing import get_type_hints, Union, Tuple, NamedTuple, get_args, get_origin import pytest import numpy as np import numpy.typing as npt -try: - from typing_extensions import get_args, get_origin - SKIP = False -except ImportError: - SKIP = True - class TypeTup(NamedTuple): typ: type @@ -36,7 +30,6 @@ TYPES = { @pytest.mark.parametrize("name,tup", TYPES.items(), ids=TYPES.keys()) -@pytest.mark.skipif(SKIP, reason="requires typing-extensions") def test_get_args(name: type, tup: TypeTup) -> None: """Test `typing.get_args`.""" typ, ref = tup.typ, tup.args @@ -45,7 +38,6 @@ def test_get_args(name: type, tup: TypeTup) -> None: @pytest.mark.parametrize("name,tup", TYPES.items(), ids=TYPES.keys()) -@pytest.mark.skipif(SKIP, reason="requires typing-extensions") def test_get_origin(name: type, tup: TypeTup) -> None: """Test `typing.get_origin`.""" typ, ref = tup.typ, tup.origin diff --git a/numpy/typing/tests/test_typing_extensions.py b/numpy/typing/tests/test_typing_extensions.py deleted file mode 100644 index f59f222fb..000000000 --- a/numpy/typing/tests/test_typing_extensions.py +++ /dev/null @@ -1,35 +0,0 @@ -"""Tests for the optional typing-extensions dependency.""" - -import sys -import textwrap -import subprocess - -CODE = textwrap.dedent(r""" - import sys - import importlib - - assert "typing_extensions" not in sys.modules - assert "numpy.typing" not in sys.modules - - # Importing `typing_extensions` will now raise an `ImportError` - sys.modules["typing_extensions"] = None - assert importlib.import_module("numpy.typing") -""") - - -def test_no_typing_extensions() -> None: - """Import `numpy.typing` in the absence of typing-extensions. - - Notes - ----- - Ideally, we'd just run the normal typing tests in an environment where - typing-extensions is not installed, but unfortunatelly this is currently - impossible as it is an indirect hard dependency of pytest. - - """ - p = subprocess.run([sys.executable, '-c', CODE], capture_output=True) - if p.returncode: - raise AssertionError( - f"Non-zero return code: {p.returncode!r}\n\n{p.stderr.decode()}" - ) - |
