Skip to content

Commit 3f86e05

Browse files
committed
Permit covariance of key type in read_csv converters argument
1 parent de675b7 commit 3f86e05

File tree

2 files changed

+65
-6
lines changed

2 files changed

+65
-6
lines changed

pandas-stubs/io/parsers/readers.pyi

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,10 @@ def read_csv(
4848
| None = ...,
4949
dtype: DtypeArg | defaultdict | None = ...,
5050
engine: CSVEngine | None = ...,
51-
converters: dict[int | str, Callable[[str], Any]] | None = ...,
51+
converters: dict[int | str, Callable[[str], Any]]
52+
| dict[int, Callable[[str], Any]]
53+
| dict[str, Callable[[str], Any]]
54+
| None = ...,
5255
true_values: list[str] = ...,
5356
false_values: list[str] = ...,
5457
skipinitialspace: bool = ...,
@@ -111,7 +114,10 @@ def read_csv(
111114
| None = ...,
112115
dtype: DtypeArg | defaultdict | None = ...,
113116
engine: CSVEngine | None = ...,
114-
converters: dict[int | str, Callable[[str], Any]] | None = ...,
117+
converters: dict[int | str, Callable[[str], Any]]
118+
| dict[int, Callable[[str], Any]]
119+
| dict[str, Callable[[str], Any]]
120+
| None = ...,
115121
true_values: list[str] = ...,
116122
false_values: list[str] = ...,
117123
skipinitialspace: bool = ...,
@@ -174,7 +180,10 @@ def read_csv(
174180
| None = ...,
175181
dtype: DtypeArg | defaultdict | None = ...,
176182
engine: CSVEngine | None = ...,
177-
converters: dict[int | str, Callable[[str], Any]] | None = ...,
183+
converters: dict[int | str, Callable[[str], Any]]
184+
| dict[int, Callable[[str], Any]]
185+
| dict[str, Callable[[str], Any]]
186+
| None = ...,
178187
true_values: list[str] = ...,
179188
false_values: list[str] = ...,
180189
skipinitialspace: bool = ...,
@@ -237,7 +246,10 @@ def read_table(
237246
| None = ...,
238247
dtype: DtypeArg | defaultdict | None = ...,
239248
engine: CSVEngine | None = ...,
240-
converters: dict[int | str, Callable[[str], Any]] | None = ...,
249+
converters: dict[int | str, Callable[[str], Any]]
250+
| dict[int, Callable[[str], Any]]
251+
| dict[str, Callable[[str], Any]]
252+
| None = ...,
241253
true_values: list[str] = ...,
242254
false_values: list[str] = ...,
243255
skipinitialspace: bool = ...,
@@ -300,7 +312,10 @@ def read_table(
300312
| None = ...,
301313
dtype: DtypeArg | defaultdict | None = ...,
302314
engine: CSVEngine | None = ...,
303-
converters: dict[int | str, Callable[[str], Any]] | None = ...,
315+
converters: dict[int | str, Callable[[str], Any]]
316+
| dict[int, Callable[[str], Any]]
317+
| dict[str, Callable[[str], Any]]
318+
| None = ...,
304319
true_values: list[str] = ...,
305320
false_values: list[str] = ...,
306321
skipinitialspace: bool = ...,
@@ -363,7 +378,10 @@ def read_table(
363378
| None = ...,
364379
dtype: DtypeArg | defaultdict | None = ...,
365380
engine: CSVEngine | None = ...,
366-
converters: dict[int | str, Callable[[str], Any]] | None = ...,
381+
converters: dict[int | str, Callable[[str], Any]]
382+
| dict[int, Callable[[str], Any]]
383+
| dict[str, Callable[[str], Any]]
384+
| None = ...,
367385
true_values: list[str] = ...,
368386
false_values: list[str] = ...,
369387
skipinitialspace: bool = ...,

tests/test_frame.py

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
List,
2020
Mapping,
2121
Tuple,
22+
TypedDict,
2223
TypeVar,
2324
Union,
2425
)
@@ -1278,6 +1279,46 @@ def test_read_csv() -> None:
12781279
pd.DataFrame,
12791280
)
12801281

1282+
# Allow a variety of dict types for the converters parameter
1283+
converters1 = {"A": lambda x: str, "B": lambda x: str}
1284+
check(
1285+
assert_type(pd.read_csv(path, converters=converters1), pd.DataFrame),
1286+
pd.DataFrame,
1287+
)
1288+
converters2 = {"A": lambda x: str, "B": lambda x: float}
1289+
check(
1290+
assert_type(pd.read_csv(path, converters=converters2), pd.DataFrame),
1291+
pd.DataFrame,
1292+
)
1293+
converters3 = {0: lambda x: str, 1: lambda x: str}
1294+
check(
1295+
assert_type(pd.read_csv(path, converters=converters3), pd.DataFrame),
1296+
pd.DataFrame,
1297+
)
1298+
converters4 = {0: lambda x: str, 1: lambda x: float}
1299+
check(
1300+
assert_type(pd.read_csv(path, converters=converters4), pd.DataFrame),
1301+
pd.DataFrame,
1302+
)
1303+
converters5: dict[int | str, Callable[[str], Any]] = {
1304+
0: lambda x: str,
1305+
"A": lambda x: float,
1306+
}
1307+
check(
1308+
assert_type(pd.read_csv(path, converters=converters5), pd.DataFrame),
1309+
pd.DataFrame,
1310+
)
1311+
1312+
class ReadCsvKwargs(TypedDict):
1313+
converters: dict[int, Callable[[str], Any]]
1314+
1315+
read_csv_kwargs: ReadCsvKwargs = {"converters": {0: int}}
1316+
1317+
check(
1318+
assert_type(pd.read_csv(path, **read_csv_kwargs), pd.DataFrame),
1319+
pd.DataFrame,
1320+
)
1321+
12811322

12821323
def test_groupby_series_methods() -> None:
12831324
df = pd.DataFrame({"x": [1, 2, 2, 3, 3], "y": [10, 20, 30, 40, 50]})

0 commit comments

Comments
 (0)