Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

MAINT: Add annotations for dtype.__getitem__, __mul__ and names #18599

Merged
merged 1 commit into from Mar 13, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
20 changes: 20 additions & 0 deletions numpy/__init__.pyi
Expand Up @@ -862,6 +862,24 @@ class dtype(Generic[_DTypeScalar]):
align: bool = ...,
copy: bool = ...,
) -> dtype[void]: ...

@overload
def __getitem__(self: dtype[void], key: List[str]) -> dtype[void]: ...
@overload
def __getitem__(self: dtype[void], key: Union[str, int]) -> dtype[Any]: ...

# NOTE: In the future 1-based multiplications will also yield `void` dtypes
@overload
def __mul__(self, value: Literal[0]) -> None: ... # type: ignore[misc]
@overload
def __mul__(self, value: Literal[1]) -> dtype[_DTypeScalar]: ...
@overload
def __mul__(self, value: int) -> dtype[void]: ...

# NOTE: `__rmul__` seems to be broken when used in combination with
# literals as of mypy 0.800. Set the return-type to `Any` for now.
def __rmul__(self, value: int) -> Any: ...

def __eq__(self, other: DTypeLike) -> bool: ...
def __ne__(self, other: DTypeLike) -> bool: ...
def __gt__(self, other: DTypeLike) -> bool: ...
Expand Down Expand Up @@ -901,6 +919,8 @@ class dtype(Generic[_DTypeScalar]):
@property
def name(self) -> str: ...
@property
def names(self) -> Optional[Tuple[str, ...]]: ...
@property
def num(self) -> int: ...
@property
def shape(self) -> _Shape: ...
Expand Down
16 changes: 16 additions & 0 deletions numpy/typing/tests/data/pass/dtype.py
@@ -1,5 +1,8 @@
import numpy as np

dtype_obj = np.dtype(np.str_)
void_dtype_obj = np.dtype([("f0", np.float64), ("f1", np.float32)])

np.dtype(dtype=np.int64)
np.dtype(int)
np.dtype("int")
Expand Down Expand Up @@ -33,3 +36,16 @@ class Test:


np.dtype(Test())

dtype_obj.names

dtype_obj * 0
dtype_obj * 2

0 * dtype_obj
2 * dtype_obj

void_dtype_obj["f0"]
void_dtype_obj[0]
void_dtype_obj[["f0", "f1"]]
void_dtype_obj[["f0"]]
19 changes: 19 additions & 0 deletions numpy/typing/tests/data/reveal/dtype.py
@@ -1,5 +1,8 @@
import numpy as np

dtype_obj: np.dtype[np.str_]
void_dtype_obj: np.dtype[np.void]

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]]

Expand Down Expand Up @@ -31,3 +34,19 @@

# Void
reveal_type(np.dtype(("U", 10))) # E: numpy.dtype[numpy.void]

reveal_type(dtype_obj.name) # E: str
reveal_type(dtype_obj.names) # E: Union[builtins.tuple[builtins.str], None]

reveal_type(dtype_obj * 0) # E: None
reveal_type(dtype_obj * 1) # E: numpy.dtype[numpy.str_]
reveal_type(dtype_obj * 2) # E: numpy.dtype[numpy.void]

reveal_type(0 * dtype_obj) # E: Any
reveal_type(1 * dtype_obj) # E: Any
reveal_type(2 * dtype_obj) # E: Any

reveal_type(void_dtype_obj["f0"]) # E: numpy.dtype[Any]
reveal_type(void_dtype_obj[0]) # E: numpy.dtype[Any]
reveal_type(void_dtype_obj[["f0", "f1"]]) # E: numpy.dtype[numpy.void]
reveal_type(void_dtype_obj[["f0"]]) # E: numpy.dtype[numpy.void]