Uh oh!
There was an error while loading.Please reload this page.
- Notifications
You must be signed in to change notification settings - Fork7.9k
Add type hints for matplotlib.dates module#30126
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 ourterms of service andprivacy statement. We’ll occasionally send you account related emails.
Already on GitHub?Sign in to your account
base:main
Are you sure you want to change the base?
Uh oh!
There was an error while loading.Please reload this page.
Conversation
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Thank you for opening your first PR into Matplotlib!
If you have not heard from us in a week or so, please leave a new comment below and that should bring it to our attention. Most of our reviewers are volunteers and sometimes things fall through the cracks.
You can also join uson gitter for real-time discussion.
For details on testing, writing docs, and our review process, please seethe developer guide
We strive to be a welcoming and open project. Please follow ourCode of Conduct.
Uh oh!
There was an error while loading.Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I've only done up to the formatters; please correct the default values in the rest.
@@ -0,0 +1,200 @@ | |||
import datetime | |||
import numpy as np |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
NumPy is third-party and thus should be in the second block between stdlib and first-party imports.
def get_epoch() -> str: ... | ||
def _dt64_to_ordinalf(d: np.datetime64 | np.ndarray) -> float | np.ndarray: ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
There seems to be a bug here; it doesn't actually acceptnp.datetime64
or return afloat
, but crashes. Maybe something to be fixed, or else the type hint shouldn't mention them.
def datestr2num(d: str | Sequence[str], default: datetime.datetime | None = ...) -> float | np.ndarray: ... | ||
def date2num(d: datetime.datetime | np.datetime64 | Sequence[datetime.datetime | np.datetime64]) -> float | np.ndarray: ... | ||
def num2date(x: float | Sequence[float], tz: str | datetime.tzinfo | None = ...) -> datetime.datetime | list[datetime.datetime]: ... | ||
def num2timedelta(x: float | Sequence[float]) -> datetime.timedelta | list[datetime.timedelta]: ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
We may want overloads on these for single input vs sequence input.
# --- Formatter Classes --- | ||
class DateFormatter(Formatter): | ||
tz: str | datetime.tzinfo | None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
This is passed through_get_tz_info
before assignment, so should always be adatetime.tzinfo
.
class DateFormatter(Formatter): | ||
tz: str | datetime.tzinfo | None | ||
fmt: str | ||
_usetex: bool | None |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
NeverNone
, though since this is private and not part of the API, I'm not sure we should type hint it..
class ConciseDateFormatter(Formatter): | ||
_locator: Locator | ||
_tz: str | datetime.tzinfo | None | ||
formats: List[str] |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Missingdefaultfmt
?
def __init__(self, locator: Locator, | ||
tz: str | datetime.tzinfo | None = None, | ||
defaultfmt: str = '%Y-%m-%d', | ||
*, usetex: bool | None = None) -> None: ... | ||
def _set_locator(self, locator: Locator) -> None: ... | ||
def __call__(self, x: float, pos: int | None = 0) -> str: ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
def__init__(self,locator:Locator, | |
tz:str|datetime.tzinfo|None=None, | |
defaultfmt:str='%Y-%m-%d', | |
*,usetex:bool|None=None)->None: ... | |
def_set_locator(self,locator:Locator)->None: ... | |
def__call__(self,x:float,pos:int|None=0)->str: ... | |
def__init__(self,locator:Locator, | |
tz:str|datetime.tzinfo|None=..., | |
defaultfmt:str=..., | |
*,usetex:bool|None=...)->None: ... | |
def_set_locator(self,locator:Locator)->None: ... | |
def__call__(self,x:float,pos:int|None=...)->str: ... |
def set(self, **kwargs: Any) -> None: ... | ||
def _update_rrule(self, **kwargs: Any) -> None: ... | ||
def _attach_tzinfo(self, dt: datetime.datetime, tzinfo: datetime.tzinfo) -> datetime.datetime: ... | ||
def _aware_return_wrapper(self, f: Callable[..., Any], returns_list: bool = False) -> Callable[..., Any]: ... |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
def_aware_return_wrapper(self,f:Callable[...,Any],returns_list:bool=False)->Callable[...,Any]: ... | |
def_aware_return_wrapper(self,f:Callable[...,Any],returns_list:bool=...)->Callable[...,Any]: ... |
defaultfmt: str | ||
_formatter: DateFormatter | ||
_usetex: bool | None | ||
scaled: dict |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
Missing key/value types.
def _set_locator(self, locator: Locator) -> None: ... | ||
def __call__(self, x: float, pos: int | None = 0) -> str: ... | ||
# --- rrulewrapper (assuming it's in rrule.py and this is its stub) --- |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others.Learn more.
I don't know what this parentheses means.
Uh oh!
There was an error while loading.Please reload this page.
PR Summary
This pull request introduces comprehensive type hint stubs (
.pyi
files) for thematplotlib.dates
module.Why this change is necessary:
By providing explicit type information, this enhancement significantly improves static type checking capabilities for
matplotlib.dates
. Developers using tools like MyPy, Pyright, or Ruff can now catch potential type-related errors earlier in the development cycle, leading to more robust and maintainable code.Problem solved:
This PR addresses the current lack of precise type information for
matplotlib.dates
classes and functions during static analysis. It makes the module's API more explicit and easier for automated type-checking tools to understand and validate.Implementation reasoning:
The implementation involves adding
.pyi
files that define the types for the core classes and functions withinmatplotlib.dates.py
. This change directly contributes to Matplotlib's ongoing initiative to expand and improve type hinting coverage across its codebase, fostering better developer experience and code quality.Closes#29994
PR Checklist
matplotlib.dates.DateFormatter
#29994" is in the body of the PR description tolink the related issuemypy
or similar type checkers to ensure no errors are introduced.Test Result
mypy, ruff and Pyright with the new

dates.pyi