Skip to content
This repository was archived by the owner on Jun 10, 2020. It is now read-only.

Commit ad402db

Browse files
Matthew Beddershoyer
authored andcommitted
Added typing information for datetime64, timedelta64 (#31)
1 parent a57ec56 commit ad402db

File tree

5 files changed

+86
-4
lines changed

5 files changed

+86
-4
lines changed

numpy-stubs/__init__.pyi

Lines changed: 31 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import builtins
22
import sys
3+
import datetime as dt
34

45
from numpy.core._internal import _ctypes
56
from typing import (
@@ -393,14 +394,42 @@ class number(generic):
393394

394395
class bool_(_real_generic): ...
395396
class object_(generic): ...
396-
class datetime64(_real_generic): ...
397+
398+
class datetime64:
399+
@overload
400+
def __init__(
401+
self, _data: Union[datetime64, str, dt.datetime] = ..., _format: str = ...
402+
) -> None: ...
403+
@overload
404+
def __init__(self, _data: int, _format: str) -> None: ...
405+
def __add__(self, other: Union[timedelta64, int]) -> datetime64: ...
406+
def __sub__(self, other: Union[timedelta64, datetime64, int]) -> timedelta64: ...
407+
397408
class integer(number, _real_generic): ...
398409
class signedinteger(integer): ...
399410
class int8(signedinteger): ...
400411
class int16(signedinteger): ...
401412
class int32(signedinteger): ...
402413
class int64(signedinteger): ...
403-
class timedelta64(signedinteger): ...
414+
415+
class timedelta64(signedinteger):
416+
def __init__(self, _data: Any = ..., _format: str = ...) -> None: ...
417+
@overload
418+
def __add__(self, other: Union[timedelta64, int]) -> timedelta64: ...
419+
@overload
420+
def __add__(self, other: datetime64) -> datetime64: ...
421+
def __sub__(self, other: Union[timedelta64, int]) -> timedelta64: ...
422+
if sys.version_info[0] < 3:
423+
@overload
424+
def __div__(self, other: timedelta64) -> float: ...
425+
@overload
426+
def __div__(self, other: float) -> timedelta64: ...
427+
@overload
428+
def __truediv__(self, other: timedelta64) -> float: ...
429+
@overload
430+
def __truediv__(self, other: float) -> timedelta64: ...
431+
def __mod__(self, other: timedelta64) -> timedelta64: ...
432+
404433
class unsignedinteger(integer): ...
405434
class uint8(unsignedinteger): ...
406435
class uint16(unsignedinteger): ...

tests/fail/scalars.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,15 @@
77

88
np.complex64(1, 2) # E: Too many arguments
99
# TODO: protocols (can't check for non-existent protocols w/ __getattr__)
10+
11+
np.datetime64(0) # E: non-matching overload
12+
13+
dt_64 = np.datetime64(0, 'D')
14+
td_64 = np.timedelta64(1, 'h')
15+
16+
dt_64 + dt_64 # E: Unsupported operand types
17+
18+
td_64 - dt_64 # E: Unsupported operand types
19+
td_64 / dt_64 # E: No overload
20+
td_64 % 1 # E: Unsupported operand types
21+
td_64 % dt_64 # E: Unsupported operand types

tests/pass/scalars.py

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,3 +50,26 @@ def __float__(self):
5050
np.uint16().ndim + 1
5151
np.uint32().strides
5252
np.uint64().shape
53+
54+
# Time structures
55+
np.datetime64()
56+
np.datetime64(0, 'D')
57+
np.datetime64('2019')
58+
np.datetime64('2019', 'D')
59+
60+
np.timedelta64()
61+
np.timedelta64(0)
62+
np.timedelta64(0, 'D')
63+
64+
dt_64 = np.datetime64(0, 'D')
65+
td_64 = np.timedelta64(1, 'h')
66+
67+
dt_64 + td_64
68+
dt_64 - dt_64
69+
dt_64 - td_64
70+
71+
td_64 + td_64
72+
td_64 - td_64
73+
td_64 / 1.
74+
td_64 / td_64
75+
td_64 % td_64

tests/reveal/scalars.py

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,20 @@
1111
reveal_type(x.itemsize) # E: int
1212
reveal_type(x.shape) # E: tuple[builtins.int]
1313
reveal_type(x.strides) # E: tuple[builtins.int]
14+
15+
# Time structures
16+
dt = np.datetime64(0, 'D')
17+
td = np.timedelta64(0, 'D')
18+
19+
reveal_type(dt + td) # E: numpy.datetime64
20+
reveal_type(dt + 1) # E: numpy.datetime64
21+
reveal_type(dt - dt) # E: numpy.timedelta64
22+
reveal_type(dt - 1) # E: numpy.timedelta64
23+
24+
reveal_type(td + td) # E: numpy.timedelta64
25+
reveal_type(td + 1) # E: numpy.timedelta64
26+
reveal_type(td - td) # E: numpy.timedelta64
27+
reveal_type(td - 1) # E: numpy.timedelta64
28+
reveal_type(td / 1.) # E: numpy.timedelta64
29+
reveal_type(td / td) # E: float
30+
reveal_type(td % td) # E: numpy.timedelta64

tests/test_stubs.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
from collections import defaultdict
23

34
import pytest
45
from mypy import api
@@ -50,14 +51,14 @@ def test_fail(path, py2_arg):
5051
with open(path) as fin:
5152
lines = fin.readlines()
5253

53-
errors = {}
54+
errors = defaultdict(lambda: "")
5455
for error_line in stdout.split("\n"):
5556
error_line = error_line.strip()
5657
if not error_line:
5758
continue
5859

5960
lineno = int(error_line.split(":")[1])
60-
errors[lineno] = error_line
61+
errors[lineno] += error_line
6162

6263
for i, line in enumerate(lines):
6364
lineno = i + 1

0 commit comments

Comments
 (0)