-
-
Notifications
You must be signed in to change notification settings - Fork 18.4k
TYP: handle mypy ignore in SelectionMixin #38239
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
Conversation
pandas/core/base.py
Outdated
@@ -152,6 +154,9 @@ class SelectionMixin: | |||
object sub-classes need to define: obj, exclusions | |||
""" | |||
|
|||
obj: Any | |||
exclusions: Set[Optional[Hashable]] = set() |
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.
Label?
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.
Right! Thank you.
I am not sure about the problem, but docs build finished with two warnings, causing CI to fail.
|
pandas/core/base.py
Outdated
@@ -152,6 +153,9 @@ class SelectionMixin: | |||
object sub-classes need to define: obj, exclusions | |||
""" | |||
|
|||
obj: Any | |||
exclusions: Set[Label] = set() |
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.
looks like the docbuild failure is bc this is public but undocumented
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.
The docstring states exclusions : set, optional
. Is the docstring referring to required class attributes? The docstring states sub-classes need to define: obj, exclusions
. why is exclusions
initialised here?
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.
exclusions
is initialized here to deal with the following mypy errors.
pandas\core\base.py:230: error: "SelectionMixin" has no attribute "exclusions" [attr-defined]
pandas\core\base.py:231: error: "SelectionMixin" has no attribute "exclusions" [attr-defined]
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.
no need to initialize if sub-classes need to define as stated in the docstring, declaration will silence those errors.
exclusions: Set[Label] = set() | |
exclusions: Set[Label] |
I documented
Any idea how to fix it? |
i was thinking just make them private |
I tried, but the thing is that they are used heavily in the classes (at least |
can you merge master |
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.
Thanks @ivanovmg for the PR
I wish I made obj of type FrameOrSeries rather than Any.
If the type of self.obj
does not change during it's lifetime, then this is the correct annotation
If I go with FrameOrSeriesUnion
This would be correct if the type of self.obj
is allowed to change.
pandas/core/base.py
Outdated
object sub-classes need to define: obj, exclusions | ||
|
||
obj : FrameOrSeries |
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 tend not to use the typing aliases in docstrings
pandas/core/base.py
Outdated
@@ -148,10 +149,18 @@ class SpecificationError(Exception): | |||
|
|||
class SelectionMixin: | |||
""" | |||
mixin implementing the selection & aggregation interface on a group-like | |||
Mixin implementing the selection & aggregation interface on a group-like |
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.
when making changes to docstrings, if possible can you make the first line a one-liner.
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.
Made as a one-liner.
pandas/core/base.py
Outdated
""" | ||
|
||
obj: 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.
obj
here is Any
and FrameOrSeries
in docstring.
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.
Yes, this looks odd.
Initially I typed obj
as FrameOrSeries
, but then mypy would raise errors of this kind.
pandas\core\window\rolling.py:228: error: FrameOrSeries? has no attribute "ndim" [attr-defined]
pandas\core\window\rolling.py:229: error: FrameOrSeries? has no attribute "__iter__" (not iterable) [attr-defined]
pandas\core\window\rolling.py:236: error: FrameOrSeries? has no attribute "__iter__" (not iterable) [attr-defined]
pandas\core\window\rolling.py:244: error: FrameOrSeries? has no attribute "_dir_additions" [attr-defined]
pandas\core\window\rolling.py:324: error: FrameOrSeries? has no attribute "index" [attr-defined]
The reason is that DataFrame
and Series
interface is similar, but different.
Some attributes are defined in one, but not defined in another, or the methods have different signatures.
So, I had to fallback with 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.
FrameOrSeries is a typevar, so to use it on a class/instance variable requires to make the SelectionMixin class generic. The mypy error suggests this.
pandas/core/base.py:161: error: Type variable "pandas._typing.FrameOrSeries" is unbound [valid-type]
pandas/core/base.py:161: note: (Hint: Use "Generic[FrameOrSeries]" or "Protocol[FrameOrSeries]" base class to bind "FrameOrSeries" inside a class)
pandas/core/base.py:161: note: (Hint: Use "FrameOrSeries" in function signature to bind "FrameOrSeries" inside a function)
if having self.obj not maintain it's type for the duration of the instance life is ok, then use FrameOrSeriesUnion instead.
mypy errors such as pandas/core/window/rolling.py:108: error: Incompatible types in assignment (expression has type "FrameOrSeries", variable has type "Union[DataFrame, Series]") [assignment]
if doing this are where FrameOrSeries aliases are used elsewhere that also would need to change to FrameOrSeriesUnion.
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 are 34 mypy errors of this kind (see details below) when setting to FrameOrSeriesUnion
.
Would it be a good idea for the follow up PR to fix them?
I think I can do them here, but first need to figure out how to deal with "CI Web and docs", since it complains about the missing documentation
2021-01-10T11:33:04.9021813Z /home/runner/work/pandas/pandas/doc/source/reference/api/pandas.DataFrame.exclusions.rst: WARNING: document isn't included in any toctree
2021-01-10T11:33:04.9024422Z /home/runner/work/pandas/pandas/doc/source/reference/api/pandas.Series.exclusions.rst: WARNING: document isn't included in any toctree
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.
Would it be a good idea for the follow up PR to fix them?
put a big TODO by the variable declaration otherwise this could get missed. Any
should only be used where we want to allow dynamic typing ( and lose the benefits of static type checking)
pandas/core/base.py
Outdated
@@ -152,6 +153,9 @@ class SelectionMixin: | |||
object sub-classes need to define: obj, exclusions | |||
""" | |||
|
|||
obj: Any | |||
exclusions: Set[Label] = set() |
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.
The docstring states exclusions : set, optional
. Is the docstring referring to required class attributes? The docstring states sub-classes need to define: obj, exclusions
. why is exclusions
initialised here?
This pull request is stale because it has been open for thirty days with no activity. Please update or respond to this comment if you're still interested in working on this. |
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.
Thanks @ivanovmg for working on this.
There are many type: ignores that are being removed here, which is good. But I do have reservations about silencing the errors using Any. This is not really addressing the problem, just making it less visible.
Could you look into actually fixing this in this PR. We could then decide to split into separate PRs if necessary.
pandas/core/base.py
Outdated
""" | ||
|
||
obj: Any | ||
"""Target object for the selection and aggregation.""" |
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.
remove or change to comment
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.
Removed
pandas/core/base.py
Outdated
# however this creates multiple mypy errors elsewhere. | ||
# Those have to be addressed in a separate PR. | ||
exclusions: Set[Hashable] | ||
"""Columns to exclude.""" |
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.
same
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.
Removed
pandas/core/base.py
Outdated
obj: Any | ||
"""Target object for the selection and aggregation.""" | ||
# GH 38239 | ||
# TODO obj here must be typed as FrameOrSeriesUnion, |
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.
# TODO obj here must be typed as FrameOrSeriesUnion, | |
# TODO: obj here must be typed as FrameOrSeriesUnion, |
pandas/core/base.py
Outdated
# however this creates multiple mypy errors elsewhere. | ||
# Those have to be addressed in a separate PR. |
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 think this adds value. can remove
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.
Removed
Co-authored-by: Simon Hawkins <[email protected]>
can you merge master |
@ivanovmg well my browser change added some whitespace :-< if you can fix up and push when you can. |
@ivanovmg can you merge master and fixup mypy failures. |
@simonjayhawkins I merged master.
In my opinion, there is a problem with the interchangeability of |
That's your call. |
Closing. |
black pandas
git diff upstream/master -u -- "*.py" | flake8 --diff
Handle mypy ignore comments in
pandas/core/base.py
, classSelectionMixin
.There were issues with attributes
obj
andexclusions
not defined in the mixin, but defined in the child classes.I wish I made
obj
of typeFrameOrSeries
rather thanAny
.This is the type used in the child classes, but this results in multiple mypy errors of this kind.
If I go with
FrameOrSeriesUnion
, then it is necessary to go and do casting where required to DataFrame or Series.This is necessary since, for example, some kwargs for either of the types are irrelevant.