Skip to content

Commit 925584b

Browse files
GH1217 Modify items/iterros/itertuples methods to return Iterator (#1225)
* GH1217 Modify items/iterros/itertuples methods to return Iterator * GH1217 PR feedback * GH1217 PR feedback * GH1217 PR feedback * GH1217 PR feedback
1 parent 65e8bad commit 925584b

File tree

4 files changed

+62
-12
lines changed

4 files changed

+62
-12
lines changed

pandas-stubs/core/frame.pyi

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -342,16 +342,16 @@ class DataFrame(NDFrame, OpsMixin, _GetItemHack):
342342
def shape(self) -> tuple[int, int]: ...
343343
@property
344344
def style(self) -> Styler: ...
345-
def items(self) -> Iterable[tuple[Hashable, Series]]: ...
346-
def iterrows(self) -> Iterable[tuple[Hashable, Series]]: ...
345+
def items(self) -> Iterator[tuple[Hashable, Series]]: ...
346+
def iterrows(self) -> Iterator[tuple[Hashable, Series]]: ...
347347
@overload
348348
def itertuples(
349349
self, index: _bool = ..., name: _str = ...
350-
) -> Iterable[_PandasNamedTuple]: ...
350+
) -> Iterator[_PandasNamedTuple]: ...
351351
@overload
352352
def itertuples(
353353
self, index: _bool = ..., name: None = None
354-
) -> Iterable[tuple[Any, ...]]: ...
354+
) -> Iterator[tuple[Any, ...]]: ...
355355
def __len__(self) -> int: ...
356356
@overload
357357
def dot(self, other: DataFrame | ArrayLike) -> Self: ...

pandas-stubs/core/series.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -611,7 +611,7 @@ class Series(IndexOpsMixin[S1], NDFrame):
611611
mode: Literal["w"] = ...,
612612
) -> _str: ...
613613
def to_xarray(self) -> xr.DataArray: ...
614-
def items(self) -> Iterable[tuple[Hashable, S1]]: ...
614+
def items(self) -> Iterator[tuple[Hashable, S1]]: ...
615615
def keys(self) -> Index: ...
616616
@overload
617617
def to_dict(self, *, into: type[dict] = ...) -> dict[Any, S1]: ...

tests/test_frame.py

Lines changed: 50 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -616,32 +616,75 @@ def test_types_median() -> None:
616616
def test_types_iterrows() -> None:
617617
df = pd.DataFrame(data={"col1": [2, 1], "col2": [3, 4]})
618618
check(
619-
assert_type(df.iterrows(), "Iterable[tuple[Hashable, pd.Series]]"),
619+
assert_type(df.iterrows(), "Iterator[tuple[Hashable, pd.Series]]"),
620620
Iterable,
621621
tuple,
622622
)
623+
for t1, t2 in df.iterrows():
624+
check(assert_type(t1, Hashable), Hashable)
625+
check(assert_type(t2, pd.Series), pd.Series)
623626

624627

625628
def test_types_itertuples() -> None:
626629
df = pd.DataFrame(data={"col1": [2, 1], "col2": [3, 4]})
627630
check(
628-
assert_type(df.itertuples(), Iterable[_PandasNamedTuple]),
629-
Iterable,
631+
assert_type(df.itertuples(), Iterator[_PandasNamedTuple]),
632+
Iterator,
630633
_PandasNamedTuple,
631634
)
632635
check(
633636
assert_type(
634-
df.itertuples(index=False, name="Foobar"), Iterable[_PandasNamedTuple]
637+
df.itertuples(index=False, name="Foobar"), Iterator[_PandasNamedTuple]
635638
),
636-
Iterable,
639+
Iterator,
637640
_PandasNamedTuple,
638641
)
639642
check(
640-
assert_type(df.itertuples(index=False, name=None), Iterable[tuple[Any, ...]]),
641-
Iterable,
643+
assert_type(df.itertuples(index=False, name=None), Iterator[tuple[Any, ...]]),
644+
Iterator,
642645
object,
643646
)
644647

648+
for t1 in df.itertuples():
649+
assert_type(t1, _PandasNamedTuple)
650+
assert t1.__class__.__name__ == "Pandas"
651+
assert isinstance(t1.Index, int)
652+
assert isinstance(t1.col1, int)
653+
assert isinstance(t1.col2, int)
654+
for k in [0, 1, 2]:
655+
assert isinstance(t1[k], int)
656+
657+
for t1 in df.itertuples(name="FooBar"):
658+
assert_type(t1, _PandasNamedTuple)
659+
assert t1.__class__.__name__ == "FooBar"
660+
assert isinstance(t1.Index, int)
661+
assert isinstance(t1.col1, int)
662+
assert isinstance(t1.col2, int)
663+
for k in [0, 1, 2]:
664+
assert isinstance(t1[k], int)
665+
666+
667+
def test_types_items() -> None:
668+
df = pd.DataFrame(data={"col1": [2, 1], "col2": [3, 4]})
669+
check(
670+
assert_type(df.items(), Iterator[tuple[Hashable, pd.Series]]),
671+
Iterator,
672+
tuple,
673+
)
674+
675+
for t1, t2 in df.items():
676+
check(assert_type(t1, Hashable), Hashable)
677+
check(assert_type(t2, pd.Series), pd.Series)
678+
679+
680+
def test_frame_iterator() -> None:
681+
"""Test iterator methods for a dataframe GH1217."""
682+
df = pd.DataFrame(data={"col1": [2, 1], "col2": [3, 4]})
683+
684+
check(assert_type(next(df.items()), tuple[Hashable, "pd.Series"]), tuple)
685+
check(assert_type(next(df.iterrows()), tuple[Hashable, "pd.Series"]), tuple)
686+
check(assert_type(next(df.itertuples()), _PandasNamedTuple), _PandasNamedTuple)
687+
645688

646689
def test_types_sum() -> None:
647690
df = pd.DataFrame(data={"col1": [2, 1], "col2": [3, 4]})

tests/test_series.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from __future__ import annotations
22

33
from collections.abc import (
4+
Hashable,
45
Iterable,
56
Iterator,
67
Sequence,
@@ -3806,3 +3807,9 @@ def foo(sf: pd.Series) -> None:
38063807

38073808
foo(s)
38083809
check(assert_type(s + pd.Series([1]), pd.Series), pd.Series)
3810+
3811+
3812+
def test_series_items() -> None:
3813+
s = pd.Series(data=[1, 2, 3, 4], index=["cow", "coal", "coalesce", ""])
3814+
check(assert_type(next(s.items()), tuple[Hashable, int]), tuple)
3815+
check(assert_type(s.items(), Iterator[tuple[Hashable, int]]), Iterator)

0 commit comments

Comments
 (0)