summaryrefslogtreecommitdiff
path: root/numpy/typing
diff options
context:
space:
mode:
authorQiyu8 <fangchunlin@huawei.com>2020-12-14 16:35:01 +0800
committerQiyu8 <fangchunlin@huawei.com>2020-12-14 16:35:01 +0800
commit4c7b3d64780c0cdfb8279c978d8b5a411995aee4 (patch)
tree4f98ed596916b9e8f5404939d7a39b86b6da52e6 /numpy/typing
parent30c01122d2631269fa28f057f6723168b64ca783 (diff)
parente3722cea8adb7b66084a7edbc6afb978c5521c16 (diff)
downloadnumpy-4c7b3d64780c0cdfb8279c978d8b5a411995aee4.tar.gz
Merge branch 'master' of github.com:numpy/numpy into einsum-dot
Diffstat (limited to 'numpy/typing')
-rw-r--r--numpy/typing/_array_like.py21
-rw-r--r--numpy/typing/tests/data/fail/array_like.py4
-rw-r--r--numpy/typing/tests/data/pass/array_like.py8
-rw-r--r--numpy/typing/tests/data/pass/dtype.py8
-rw-r--r--numpy/typing/tests/data/pass/flatiter.py2
-rw-r--r--numpy/typing/tests/data/reveal/dtype.py8
-rw-r--r--numpy/typing/tests/data/reveal/flatiter.py21
7 files changed, 49 insertions, 23 deletions
diff --git a/numpy/typing/_array_like.py b/numpy/typing/_array_like.py
index a1a604239..63b67b33a 100644
--- a/numpy/typing/_array_like.py
+++ b/numpy/typing/_array_like.py
@@ -1,7 +1,9 @@
+from __future__ import annotations
+
import sys
-from typing import Any, overload, Sequence, TYPE_CHECKING, Union
+from typing import Any, overload, Sequence, TYPE_CHECKING, Union, TypeVar
-from numpy import ndarray
+from numpy import ndarray, dtype
from ._scalars import _ScalarLike
from ._dtype_like import DTypeLike
@@ -16,12 +18,15 @@ else:
else:
HAVE_PROTOCOL = True
+_DType = TypeVar("_DType", bound="dtype[Any]")
+
if TYPE_CHECKING or HAVE_PROTOCOL:
- class _SupportsArray(Protocol):
- @overload
- def __array__(self, __dtype: DTypeLike = ...) -> ndarray: ...
- @overload
- def __array__(self, dtype: DTypeLike = ...) -> ndarray: ...
+ # The `_SupportsArray` protocol only cares about the default dtype
+ # (i.e. `dtype=None`) of the to-be returned array.
+ # Concrete implementations of the protocol are responsible for adding
+ # any and all remaining overloads
+ class _SupportsArray(Protocol[_DType]):
+ def __array__(self, dtype: None = ...) -> ndarray[Any, _DType]: ...
else:
_SupportsArray = Any
@@ -36,5 +41,5 @@ ArrayLike = Union[
_ScalarLike,
Sequence[_ScalarLike],
Sequence[Sequence[Any]], # TODO: Wait for support for recursive types
- _SupportsArray,
+ "_SupportsArray[Any]",
]
diff --git a/numpy/typing/tests/data/fail/array_like.py b/numpy/typing/tests/data/fail/array_like.py
index a97e72dc7..3bbd29061 100644
--- a/numpy/typing/tests/data/fail/array_like.py
+++ b/numpy/typing/tests/data/fail/array_like.py
@@ -11,6 +11,6 @@ x2: ArrayLike = A() # E: Incompatible types in assignment
x3: ArrayLike = {1: "foo", 2: "bar"} # E: Incompatible types in assignment
scalar = np.int64(1)
-scalar.__array__(dtype=np.float64) # E: Unexpected keyword argument
+scalar.__array__(dtype=np.float64) # E: No overload variant
array = np.array([1])
-array.__array__(dtype=np.float64) # E: Unexpected keyword argument
+array.__array__(dtype=np.float64) # E: No overload variant
diff --git a/numpy/typing/tests/data/pass/array_like.py b/numpy/typing/tests/data/pass/array_like.py
index f85724267..563fc08c7 100644
--- a/numpy/typing/tests/data/pass/array_like.py
+++ b/numpy/typing/tests/data/pass/array_like.py
@@ -25,13 +25,13 @@ class A:
x13: ArrayLike = A()
scalar: _SupportsArray = np.int64(1)
-scalar.__array__(np.float64)
+scalar.__array__(None)
array: _SupportsArray = np.array(1)
-array.__array__(np.float64)
+array.__array__(None)
a: _SupportsArray = A()
-a.__array__(np.int64)
-a.__array__(dtype=np.int64)
+a.__array__(None)
+a.__array__(dtype=None)
# Escape hatch for when you mean to make something like an object
# array.
diff --git a/numpy/typing/tests/data/pass/dtype.py b/numpy/typing/tests/data/pass/dtype.py
index cbae8c078..a97edc302 100644
--- a/numpy/typing/tests/data/pass/dtype.py
+++ b/numpy/typing/tests/data/pass/dtype.py
@@ -1,5 +1,7 @@
import numpy as np
+dtype_obj = np.dtype(np.str_)
+
np.dtype(dtype=np.int64)
np.dtype(int)
np.dtype("int")
@@ -33,3 +35,9 @@ class Test:
np.dtype(Test())
+
+# Methods and attributes
+dtype_obj.base
+dtype_obj.subdtype
+dtype_obj.newbyteorder()
+dtype_obj.type
diff --git a/numpy/typing/tests/data/pass/flatiter.py b/numpy/typing/tests/data/pass/flatiter.py
index c0219eb2b..4fdf25299 100644
--- a/numpy/typing/tests/data/pass/flatiter.py
+++ b/numpy/typing/tests/data/pass/flatiter.py
@@ -12,3 +12,5 @@ a[0]
a[[0, 1, 2]]
a[...]
a[:]
+a.__array__()
+a.__array__(np.float64)
diff --git a/numpy/typing/tests/data/reveal/dtype.py b/numpy/typing/tests/data/reveal/dtype.py
index d414f2c49..626a15270 100644
--- a/numpy/typing/tests/data/reveal/dtype.py
+++ b/numpy/typing/tests/data/reveal/dtype.py
@@ -1,5 +1,7 @@
import numpy as np
+dtype_obj: np.dtype[np.str_]
+
reveal_type(np.dtype(np.float64)) # E: numpy.dtype[numpy.floating[numpy.typing._64Bit]]
reveal_type(np.dtype(np.int64)) # E: numpy.dtype[numpy.signedinteger[numpy.typing._64Bit]]
@@ -31,3 +33,9 @@ reveal_type(np.dtype("S8")) # E: numpy.dtype
# Void
reveal_type(np.dtype(("U", 10))) # E: numpy.dtype[numpy.void]
+
+# Methods and attributes
+reveal_type(dtype_obj.base) # E: numpy.dtype[numpy.str_]
+reveal_type(dtype_obj.subdtype) # E: Union[Tuple[numpy.dtype[numpy.str_], builtins.tuple[builtins.int]], None]
+reveal_type(dtype_obj.newbyteorder()) # E: numpy.dtype[numpy.str_]
+reveal_type(dtype_obj.type) # E: Type[numpy.str_]
diff --git a/numpy/typing/tests/data/reveal/flatiter.py b/numpy/typing/tests/data/reveal/flatiter.py
index 56cdc7a0e..221101ebb 100644
--- a/numpy/typing/tests/data/reveal/flatiter.py
+++ b/numpy/typing/tests/data/reveal/flatiter.py
@@ -1,14 +1,17 @@
+from typing import Any
import numpy as np
-a: "np.flatiter[np.ndarray]"
+a: np.flatiter[np.ndarray[Any, np.dtype[np.str_]]]
-reveal_type(a.base) # E: numpy.ndarray*
-reveal_type(a.copy()) # E: numpy.ndarray*
+reveal_type(a.base) # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
+reveal_type(a.copy()) # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
reveal_type(a.coords) # E: tuple[builtins.int]
reveal_type(a.index) # E: int
-reveal_type(iter(a)) # E: Iterator[numpy.generic*]
-reveal_type(next(a)) # E: numpy.generic
-reveal_type(a[0]) # E: numpy.generic
-reveal_type(a[[0, 1, 2]]) # E: numpy.ndarray*
-reveal_type(a[...]) # E: numpy.ndarray*
-reveal_type(a[:]) # E: numpy.ndarray*
+reveal_type(iter(a)) # E: Iterator[numpy.str_]
+reveal_type(next(a)) # E: numpy.str_
+reveal_type(a[0]) # E: numpy.str_
+reveal_type(a[[0, 1, 2]]) # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
+reveal_type(a[...]) # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
+reveal_type(a[:]) # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
+reveal_type(a.__array__()) # E: numpy.ndarray[Any, numpy.dtype[numpy.str_]]
+reveal_type(a.__array__(np.float64)) # E: numpy.ndarray[Any, numpy.dtype[Any]]