|
1 | 1 | from __future__ import annotations
|
2 | 2 |
|
3 |
| -from collections import defaultdict |
| 3 | +from collections import ( |
| 4 | + OrderedDict, |
| 5 | + defaultdict, |
| 6 | +) |
4 | 7 | from collections.abc import (
|
| 8 | + Callable, |
5 | 9 | Hashable,
|
6 | 10 | Iterable,
|
7 | 11 | Iterator,
|
|
20 | 24 | from typing import (
|
21 | 25 | TYPE_CHECKING,
|
22 | 26 | Any,
|
23 |
| - Callable, |
24 | 27 | Generic,
|
25 | 28 | TypedDict,
|
26 | 29 | TypeVar,
|
|
38 | 41 | )
|
39 | 42 | import pytest
|
40 | 43 | from typing_extensions import (
|
| 44 | + Never, |
41 | 45 | TypeAlias,
|
42 | 46 | assert_never,
|
43 | 47 | assert_type,
|
@@ -2199,19 +2203,6 @@ def test_types_resample() -> None:
|
2199 | 2203 | df.resample(datetime.timedelta(minutes=20), origin="epoch", on="date")
|
2200 | 2204 |
|
2201 | 2205 |
|
2202 |
| -def test_types_to_dict() -> None: |
2203 |
| - data = pd.DataFrame({"a": [1], "b": [2]}) |
2204 |
| - check(assert_type(data.to_dict(orient="records"), list[dict[Hashable, Any]]), list) |
2205 |
| - check(assert_type(data.to_dict(orient="dict"), dict[Hashable, Any]), dict) |
2206 |
| - check(assert_type(data.to_dict(orient="list"), dict[Hashable, Any]), dict) |
2207 |
| - check(assert_type(data.to_dict(orient="series"), dict[Hashable, Any]), dict) |
2208 |
| - check(assert_type(data.to_dict(orient="split"), dict[Hashable, Any]), dict) |
2209 |
| - check(assert_type(data.to_dict(orient="index"), dict[Hashable, Any]), dict) |
2210 |
| - |
2211 |
| - # orient param accepting "tight" added in 1.4.0 https://pandas.pydata.org/docs/whatsnew/v1.4.0.html |
2212 |
| - check(assert_type(data.to_dict(orient="tight"), dict[Hashable, Any]), dict) |
2213 |
| - |
2214 |
| - |
2215 | 2206 | def test_types_from_dict() -> None:
|
2216 | 2207 | check(
|
2217 | 2208 | assert_type(
|
@@ -3746,33 +3737,87 @@ def test_to_records() -> None:
|
3746 | 3737 | )
|
3747 | 3738 |
|
3748 | 3739 |
|
3749 |
| -def test_to_dict() -> None: |
3750 |
| - check(assert_type(DF.to_dict(), dict[Hashable, Any]), dict) |
3751 |
| - check(assert_type(DF.to_dict("split"), dict[Hashable, Any]), dict) |
| 3740 | +def test_to_dict_simple() -> None: |
| 3741 | + data = pd.DataFrame({"a": [1], "b": [2]}) |
| 3742 | + check(assert_type(data.to_dict(), dict[Hashable, Any]), dict) |
| 3743 | + check(assert_type(data.to_dict("records"), list[dict[Hashable, Any]]), list) |
| 3744 | + check(assert_type(data.to_dict("index"), dict[Hashable, dict[Hashable, Any]]), dict) |
| 3745 | + check(assert_type(data.to_dict("dict"), dict[Hashable, Any]), dict) |
| 3746 | + check(assert_type(data.to_dict("list"), dict[Hashable, Any]), dict) |
| 3747 | + check(assert_type(data.to_dict("series"), dict[Hashable, Any]), dict) |
| 3748 | + check(assert_type(data.to_dict("split"), dict[str, list]), dict, str) |
| 3749 | + |
| 3750 | + # orient param accepting "tight" added in 1.4.0 https://pandas.pydata.org/docs/whatsnew/v1.4.0.html |
| 3751 | + check(assert_type(data.to_dict("tight"), dict[str, list]), dict, str) |
3752 | 3752 |
|
3753 |
| - target: MutableMapping = defaultdict(list) |
| 3753 | + if TYPE_CHECKING_INVALID_USAGE: |
| 3754 | + |
| 3755 | + def test(mapping: Mapping) -> None: # pyright: ignore[reportUnusedFunction] |
| 3756 | + data.to_dict(into=mapping) # type: ignore[call-overload] # pyright: ignore[reportArgumentType,reportCallIssue] |
| 3757 | + |
| 3758 | + assert_type(data.to_dict(into=defaultdict), Never) |
| 3759 | + assert_type(data.to_dict("records", into=defaultdict), Never) |
| 3760 | + assert_type(data.to_dict("index", into=defaultdict), Never) |
| 3761 | + assert_type(data.to_dict("dict", into=defaultdict), Never) |
| 3762 | + assert_type(data.to_dict("list", into=defaultdict), Never) |
| 3763 | + assert_type(data.to_dict("series", into=defaultdict), Never) |
| 3764 | + assert_type(data.to_dict("split", into=defaultdict), Never) |
| 3765 | + assert_type(data.to_dict("tight", into=defaultdict), Never) |
| 3766 | + |
| 3767 | + |
| 3768 | +def test_to_dict_into_defaultdict() -> None: |
| 3769 | + """Test DataFrame.to_dict with `into` is an instance of defaultdict[Any, list]""" |
| 3770 | + |
| 3771 | + data = pd.DataFrame({("str", "rts"): [[1, 2, 4], [2, 3], [3]]}) |
| 3772 | + target: defaultdict[Any, list] = defaultdict(list) |
| 3773 | + |
| 3774 | + check( |
| 3775 | + assert_type(data.to_dict(into=target), defaultdict[Any, list]), |
| 3776 | + defaultdict, |
| 3777 | + tuple, |
| 3778 | + ) |
3754 | 3779 | check(
|
3755 |
| - assert_type(DF.to_dict(into=target), MutableMapping[Hashable, Any]), defaultdict |
| 3780 | + assert_type( |
| 3781 | + data.to_dict("index", into=target), |
| 3782 | + defaultdict[Hashable, dict[Hashable, Any]], |
| 3783 | + ), |
| 3784 | + defaultdict, |
| 3785 | + ) |
| 3786 | + check( |
| 3787 | + assert_type(data.to_dict("tight", into=target), MutableMapping[str, list]), |
| 3788 | + defaultdict, |
| 3789 | + str, |
3756 | 3790 | )
|
3757 |
| - target = defaultdict(list) |
3758 | 3791 | check(
|
3759 |
| - assert_type(DF.to_dict("tight", into=target), MutableMapping[Hashable, Any]), |
| 3792 | + assert_type(data.to_dict("records", into=target), list[defaultdict[Any, list]]), |
| 3793 | + list, |
3760 | 3794 | defaultdict,
|
3761 | 3795 | )
|
3762 |
| - target = defaultdict(list) |
3763 |
| - check(assert_type(DF.to_dict("records"), list[dict[Hashable, Any]]), list) |
| 3796 | + |
| 3797 | + |
| 3798 | +def test_to_dict_into_ordered_dict() -> None: |
| 3799 | + """Test DataFrame.to_dict with `into=OrderedDict`""" |
| 3800 | + |
| 3801 | + data = pd.DataFrame({("str", "rts"): [[1, 2, 4], [2, 3], [3]]}) |
| 3802 | + |
| 3803 | + check(assert_type(data.to_dict(into=OrderedDict), OrderedDict), OrderedDict, tuple) |
3764 | 3804 | check(
|
3765 | 3805 | assert_type(
|
3766 |
| - DF.to_dict("records", into=target), list[MutableMapping[Hashable, Any]] |
| 3806 | + data.to_dict("index", into=OrderedDict), |
| 3807 | + OrderedDict[Hashable, dict[Hashable, Any]], |
3767 | 3808 | ),
|
| 3809 | + OrderedDict, |
| 3810 | + ) |
| 3811 | + check( |
| 3812 | + assert_type(data.to_dict("tight", into=OrderedDict), MutableMapping[str, list]), |
| 3813 | + OrderedDict, |
| 3814 | + str, |
| 3815 | + ) |
| 3816 | + check( |
| 3817 | + assert_type(data.to_dict("records", into=OrderedDict), list[OrderedDict]), |
3768 | 3818 | list,
|
| 3819 | + OrderedDict, |
3769 | 3820 | )
|
3770 |
| - if TYPE_CHECKING_INVALID_USAGE: |
3771 |
| - |
3772 |
| - def test(mapping: Mapping) -> None: # pyright: ignore[reportUnusedFunction] |
3773 |
| - DF.to_dict( # type: ignore[call-overload] |
3774 |
| - into=mapping # pyright: ignore[reportArgumentType,reportCallIssue] |
3775 |
| - ) |
3776 | 3821 |
|
3777 | 3822 |
|
3778 | 3823 | def test_neg() -> None:
|
@@ -4247,19 +4292,22 @@ def test_to_dict_index() -> None:
|
4247 | 4292 | assert_type(df.to_dict(orient="series", index=True), dict[Hashable, Any]), dict
|
4248 | 4293 | )
|
4249 | 4294 | check(
|
4250 |
| - assert_type(df.to_dict(orient="index", index=True), dict[Hashable, Any]), dict |
| 4295 | + assert_type( |
| 4296 | + df.to_dict(orient="index", index=True), dict[Hashable, dict[Hashable, Any]] |
| 4297 | + ), |
| 4298 | + dict, |
4251 | 4299 | )
|
4252 | 4300 | check(
|
4253 |
| - assert_type(df.to_dict(orient="split", index=True), dict[Hashable, Any]), dict |
| 4301 | + assert_type(df.to_dict(orient="split", index=True), dict[str, list]), dict, str |
4254 | 4302 | )
|
4255 | 4303 | check(
|
4256 |
| - assert_type(df.to_dict(orient="tight", index=True), dict[Hashable, Any]), dict |
| 4304 | + assert_type(df.to_dict(orient="tight", index=True), dict[str, list]), dict, str |
4257 | 4305 | )
|
4258 | 4306 | check(
|
4259 |
| - assert_type(df.to_dict(orient="tight", index=False), dict[Hashable, Any]), dict |
| 4307 | + assert_type(df.to_dict(orient="tight", index=False), dict[str, list]), dict, str |
4260 | 4308 | )
|
4261 | 4309 | check(
|
4262 |
| - assert_type(df.to_dict(orient="split", index=False), dict[Hashable, Any]), dict |
| 4310 | + assert_type(df.to_dict(orient="split", index=False), dict[str, list]), dict, str |
4263 | 4311 | )
|
4264 | 4312 | if TYPE_CHECKING_INVALID_USAGE:
|
4265 | 4313 | check(assert_type(df.to_dict(orient="records", index=False), list[dict[Hashable, Any]]), list) # type: ignore[assert-type, call-overload] # pyright: ignore[reportArgumentType,reportAssertTypeFailure,reportCallIssue]
|
|
0 commit comments