From e2875e8c3a9d747ef5b465a594216c399c67b5c4 Mon Sep 17 00:00:00 2001 From: phofl Date: Fri, 22 Jan 2021 23:38:19 +0100 Subject: [PATCH 1/4] TYP: Fix mypy ignores in parsers --- pandas/io/parsers/base_parser.py | 34 +++++++------ pandas/io/parsers/c_parser_wrapper.py | 18 ++----- pandas/io/parsers/python_parser.py | 70 ++++++--------------------- pandas/io/parsers/readers.py | 31 ++++-------- 4 files changed, 48 insertions(+), 105 deletions(-) diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index 64c3b1e64a659..75040c52bc3b9 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -2,7 +2,18 @@ import csv import datetime import itertools -from typing import Any, Dict, Iterable, List, Optional, Sequence, Set, Union, cast +from typing import ( + Any, + DefaultDict, + Dict, + Iterable, + List, + Optional, + Sequence, + Set, + Union, + cast, +) import warnings import numpy as np @@ -333,9 +344,7 @@ def _maybe_dedup_names(self, names): # would be nice! if self.mangle_dupe_cols: names = list(names) # so we can index - # pandas\io\parsers.py:1559: error: Need type annotation for - # 'counts' [var-annotated] - counts = defaultdict(int) # type: ignore[var-annotated] + counts: DefaultDict[Union[int, str], int] = defaultdict(int) is_potential_mi = _is_potential_multi_index(names, self.index_col) for i, col in enumerate(names): @@ -380,9 +389,8 @@ def _make_index(self, data, alldata, columns, indexnamerow=False): # add names for the index if indexnamerow: coffset = len(indexnamerow) - len(columns) - # pandas\io\parsers.py:1604: error: Item "None" of "Optional[Any]" - # has no attribute "set_names" [union-attr] - index = index.set_names(indexnamerow[:coffset]) # type: ignore[union-attr] + assert index is not None + index = index.set_names(indexnamerow[:coffset]) # maybe create a mi on the columns columns = self._maybe_make_multi_index_columns(columns, self.col_names) @@ -456,9 +464,8 @@ def _agg_index(self, index, try_parse_dates=True) -> Index: col_na_fvalues = set() if isinstance(self.na_values, dict): - # pandas\io\parsers.py:1678: error: Value of type - # "Optional[Any]" is not indexable [index] - col_name = self.index_names[i] # type: ignore[index] + assert self.index_names is not None + col_name = self.index_names[i] if col_name is not None: col_na_values, col_na_fvalues = _get_na_values( col_name, self.na_values, self.na_fvalues, self.keep_default_na @@ -780,7 +787,7 @@ def _clean_index_names(self, columns, index_col, unnamed_cols): return [None] * len(index_col), columns, index_col cp_cols = list(columns) - index_names = [] + index_names: List[Optional[Union[int, str]]] = [] # don't mutate index_col = list(index_col) @@ -801,10 +808,7 @@ def _clean_index_names(self, columns, index_col, unnamed_cols): # Only clean index names that were placeholders. for i, name in enumerate(index_names): if isinstance(name, str) and name in unnamed_cols: - # pandas\io\parsers.py:3445: error: No overload variant of - # "__setitem__" of "list" matches argument types "int", "None" - # [call-overload] - index_names[i] = None # type: ignore[call-overload] + index_names[i] = None return index_names, columns, index_col diff --git a/pandas/io/parsers/c_parser_wrapper.py b/pandas/io/parsers/c_parser_wrapper.py index b4c00dfe9b3e7..cea5cea6e99fa 100644 --- a/pandas/io/parsers/c_parser_wrapper.py +++ b/pandas/io/parsers/c_parser_wrapper.py @@ -1,3 +1,5 @@ +from typing import List, Optional, Union + import pandas._libs.parsers as parsers from pandas._typing import FilePathOrBuffer @@ -134,12 +136,8 @@ def __init__(self, src: FilePathOrBuffer, **kwds): self.index_names = index_names if self._reader.header is None and not passed_names: - # pandas\io\parsers.py:1997: error: Argument 1 to "len" has - # incompatible type "Optional[Any]"; expected "Sized" - # [arg-type] - self.index_names = [None] * len( - self.index_names # type: ignore[arg-type] - ) + assert self.index_names is not None + self.index_names = [None] * len(self.index_names) self._implicit_index = self._reader.leading_cols > 0 @@ -159,6 +157,7 @@ def _set_noconvert_columns(self): Currently, any column that is involved with date parsing will not undergo such conversions. """ + usecols: Optional[List[Union[int, str]]] = None names = self.orig_names if self.usecols_dtype == "integer": # A set of integers will be converted to a list in @@ -169,13 +168,6 @@ def _set_noconvert_columns(self): # The names attribute should have the correct columns # in the proper order for indexing with parse_dates. usecols = self.names[:] - else: - # Usecols is empty. - - # pandas\io\parsers.py:2030: error: Incompatible types in - # assignment (expression has type "None", variable has type - # "List[Any]") [assignment] - usecols = None # type: ignore[assignment] def _set(x): if usecols is not None and is_integer(x): diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index ba05eb4a6599f..f223bb28e1dc0 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -3,7 +3,7 @@ from io import StringIO import re import sys -from typing import Iterator, List, Optional, cast +from typing import DefaultDict, Iterator, List, Optional, Set, cast import numpy as np @@ -119,7 +119,7 @@ def __init__(self, f: Union[FilePathOrBuffer, List], **kwds): self.columns = self.columns[0] # get popped off for index - self.orig_names = list(self.columns) + self.orig_names: List[Union[int, str]] = list(self.columns) # needs to be cleaned/refactored # multiple date column thing turning into a real spaghetti factory @@ -273,10 +273,7 @@ def read(self, rows=None): # done with first read, next time raise StopIteration self._first_chunk = False - # pandas\io\parsers.py:2480: error: Argument 1 to "list" has - # incompatible type "Optional[Any]"; expected "Iterable[Any]" - # [arg-type] - columns = list(self.orig_names) # type: ignore[arg-type] + columns = list(self.orig_names) if not len(content): # pragma: no cover # DataFrame with the right metadata, even though it's length 0 names = self._maybe_dedup_names(self.orig_names) @@ -329,15 +326,8 @@ def _clean_mapping(mapping): """converts col numbers to names""" clean = {} for col, v in mapping.items(): - # pandas\io\parsers.py:2537: error: Unsupported right operand - # type for in ("Optional[Any]") [operator] - if ( - isinstance(col, int) - and col not in self.orig_names # type: ignore[operator] - ): - # pandas\io\parsers.py:2538: error: Value of type - # "Optional[Any]" is not indexable [index] - col = self.orig_names[col] # type: ignore[index] + if isinstance(col, int) and col not in self.orig_names: + col = self.orig_names[col] clean[col] = v return clean @@ -357,15 +347,8 @@ def _clean_mapping(mapping): na_value = self.na_values[col] na_fvalue = self.na_fvalues[col] - # pandas\io\parsers.py:2558: error: Unsupported right operand - # type for in ("Optional[Any]") [operator] - if ( - isinstance(col, int) - and col not in self.orig_names # type: ignore[operator] - ): - # pandas\io\parsers.py:2559: error: Value of type - # "Optional[Any]" is not indexable [index] - col = self.orig_names[col] # type: ignore[index] + if isinstance(col, int) and col not in self.orig_names: + col = self.orig_names[col] clean_na_values[col] = na_value clean_na_fvalues[col] = na_fvalue @@ -386,10 +369,7 @@ def _infer_columns(self): names = self.names num_original_columns = 0 clear_buffer = True - # pandas\io\parsers.py:2580: error: Need type annotation for - # 'unnamed_cols' (hint: "unnamed_cols: Set[] = ...") - # [var-annotated] - unnamed_cols = set() # type: ignore[var-annotated] + unnamed_cols: Set[Optional[Union[int, str]]] = set() if self.header is not None: header = self.header @@ -403,9 +383,7 @@ def _infer_columns(self): have_mi_columns = False header = [header] - # pandas\io\parsers.py:2594: error: Need type annotation for - # 'columns' (hint: "columns: List[] = ...") [var-annotated] - columns = [] # type: ignore[var-annotated] + columns: List[List[Optional[Union[int, str]]]] = [] for level, hr in enumerate(header): try: line = self._buffered_line() @@ -434,7 +412,7 @@ def _infer_columns(self): line = self.names[:] - this_columns = [] + this_columns: List[Optional[Union[int, str]]] = [] this_unnamed_cols = [] for i, c in enumerate(line): @@ -450,9 +428,7 @@ def _infer_columns(self): this_columns.append(c) if not have_mi_columns and self.mangle_dupe_cols: - # pandas\io\parsers.py:2639: error: Need type annotation - # for 'counts' [var-annotated] - counts = defaultdict(int) # type: ignore[var-annotated] + counts: DefaultDict = defaultdict(int) for i, col in enumerate(this_columns): cur_count = counts[col] @@ -476,16 +452,10 @@ def _infer_columns(self): if lc != unnamed_count and lc - ic > unnamed_count: clear_buffer = False - # pandas\io\parsers.py:2663: error: List item 0 has - # incompatible type "None"; expected "str" - # [list-item] - this_columns = [None] * lc # type: ignore[list-item] + this_columns = [None] * lc self.buf = [self.buf[-1]] - # pandas\io\parsers.py:2666: error: Argument 1 to "append" of - # "list" has incompatible type "List[str]"; expected - # "List[None]" [arg-type] - columns.append(this_columns) # type: ignore[arg-type] + columns.append(this_columns) unnamed_cols.update({this_columns[i] for i in this_unnamed_cols}) if len(columns) == 1: @@ -527,19 +497,9 @@ def _infer_columns(self): if not names: if self.prefix: - # pandas\io\parsers.py:2711: error: List comprehension has - # incompatible type List[str]; expected List[None] [misc] - columns = [ - [ - f"{self.prefix}{i}" # type: ignore[misc] - for i in range(ncols) - ] - ] + columns = [[f"{self.prefix}{i}" for i in range(ncols)]] else: - # pandas\io\parsers.py:2713: error: Argument 1 to "list" - # has incompatible type "range"; expected "Iterable[None]" - # [arg-type] - columns = [list(range(ncols))] # type: ignore[arg-type] + columns = [list(range(ncols))] columns = self._handle_usecols(columns, columns[0]) else: if self.usecols is None or len(names) >= num_original_columns: diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index 37814a5debf2e..d96a39431e681 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -6,7 +6,7 @@ import csv import sys from textwrap import fill -from typing import Any, Dict, Optional, Set, Type +from typing import Any, Dict, List, Optional, Set, Type import warnings import numpy as np @@ -722,6 +722,7 @@ def _get_options_with_defaults(self, engine): kwds = self.orig_options options = {} + default: Optional[object] for argname, default in parser_defaults.items(): value = kwds.get(argname, default) @@ -751,10 +752,7 @@ def _get_options_with_defaults(self, engine): options[argname] = value if engine == "python-fwf": - # pandas\io\parsers.py:907: error: Incompatible types in assignment - # (expression has type "object", variable has type "Union[int, str, - # None]") [assignment] - for argname, default in _fwf_defaults.items(): # type: ignore[assignment] + for argname, default in _fwf_defaults.items(): options[argname] = kwds.get(argname, default) return options @@ -1048,15 +1046,13 @@ def TextParser(*args, **kwds): def _clean_na_values(na_values, keep_default_na=True): - + na_fvalues: Union[Set, Dict] if na_values is None: if keep_default_na: na_values = STR_NA_VALUES else: na_values = set() - # pandas\io\parsers.py:3387: error: Need type annotation for - # 'na_fvalues' (hint: "na_fvalues: Set[] = ...") [var-annotated] - na_fvalues = set() # type: ignore[var-annotated] + na_fvalues = set() elif isinstance(na_values, dict): old_na_values = na_values.copy() na_values = {} # Prevent aliasing. @@ -1073,12 +1069,7 @@ def _clean_na_values(na_values, keep_default_na=True): v = set(v) | STR_NA_VALUES na_values[k] = v - # pandas\io\parsers.py:3404: error: Incompatible types in assignment - # (expression has type "Dict[Any, Any]", variable has type "Set[Any]") - # [assignment] - na_fvalues = { # type: ignore[assignment] - k: _floatify_na_values(v) for k, v in na_values.items() - } + na_fvalues = {k: _floatify_na_values(v) for k, v in na_values.items()} else: if not is_list_like(na_values): na_values = [na_values] @@ -1106,7 +1097,7 @@ def _floatify_na_values(na_values): def _stringify_na_values(na_values): """ return a stringified and numeric for these values """ - result = [] + result: List[Union[int, str, float]] = [] for x in na_values: result.append(str(x)) result.append(x) @@ -1119,15 +1110,11 @@ def _stringify_na_values(na_values): result.append(f"{v}.0") result.append(str(v)) - # pandas\io\parsers.py:3522: error: Argument 1 to "append" of - # "list" has incompatible type "float"; expected "str" [arg-type] - result.append(v) # type: ignore[arg-type] + result.append(v) except (TypeError, ValueError, OverflowError): pass try: - # pandas\io\parsers.py:3526: error: Argument 1 to "append" of - # "list" has incompatible type "int"; expected "str" [arg-type] - result.append(int(x)) # type: ignore[arg-type] + result.append(int(x)) except (TypeError, ValueError, OverflowError): pass return set(result) From f22e3d68e8257bce6a241794ea7a345267ee8137 Mon Sep 17 00:00:00 2001 From: phofl Date: Thu, 28 Jan 2021 22:26:19 +0100 Subject: [PATCH 2/4] Use new annotations --- pandas/io/parsers/base_parser.py | 10 ++++++---- pandas/io/parsers/python_parser.py | 10 ++++++---- pandas/io/parsers/readers.py | 5 +++-- 3 files changed, 15 insertions(+), 10 deletions(-) diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index 5b7a0f9a2754b..59b72aad4d592 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections import defaultdict import csv import datetime @@ -346,7 +348,7 @@ def _maybe_dedup_names(self, names): # would be nice! if self.mangle_dupe_cols: names = list(names) # so we can index - counts: DefaultDict[Union[int, str], int] = defaultdict(int) + counts: DefaultDict[int | str, int] = defaultdict(int) is_potential_mi = _is_potential_multi_index(names, self.index_col) for i, col in enumerate(names): @@ -556,7 +558,7 @@ def _convert_to_ndarrays( return result def _set_noconvert_dtype_columns( - self, col_indices: List[int], names: List[Union[int, str]] + self, col_indices: List[int], names: List[int | str] ) -> Set[int]: """ Set the columns that should not undergo dtype conversions. @@ -575,7 +577,7 @@ def _set_noconvert_dtype_columns( ------- A set of integers containing the positions of the columns not to convert. """ - usecols: Optional[Union[List[int], List[str]]] + usecols: List[int] | List[str] | None noconvert_columns = set() if self.usecols_dtype == "integer": # A set of integers will be converted to a list in @@ -857,7 +859,7 @@ def _clean_index_names(self, columns, index_col, unnamed_cols): return [None] * len(index_col), columns, index_col cp_cols = list(columns) - index_names: List[Optional[Union[int, str]]] = [] + index_names: List[int | str | None] = [] # don't mutate index_col = list(index_col) diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index ef9792a9a6eed..948166e11b6fd 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -1,3 +1,5 @@ +from __future__ import annotations + from collections import abc, defaultdict import csv from io import StringIO @@ -118,7 +120,7 @@ def __init__(self, f: Union[FilePathOrBuffer, List], **kwds): self.columns = self.columns[0] # get popped off for index - self.orig_names: List[Union[int, str]] = list(self.columns) + self.orig_names: List[int | str] = list(self.columns) # needs to be cleaned/refactored # multiple date column thing turning into a real spaghetti factory @@ -332,7 +334,7 @@ def _infer_columns(self): names = self.names num_original_columns = 0 clear_buffer = True - unnamed_cols: Set[Optional[Union[int, str]]] = set() + unnamed_cols: Set[int | str | None] = set() if self.header is not None: header = self.header @@ -346,7 +348,7 @@ def _infer_columns(self): have_mi_columns = False header = [header] - columns: List[List[Optional[Union[int, str]]]] = [] + columns: List[List[int | str | None]] = [] for level, hr in enumerate(header): try: line = self._buffered_line() @@ -375,7 +377,7 @@ def _infer_columns(self): line = self.names[:] - this_columns: List[Optional[Union[int, str]]] = [] + this_columns: List[int | str | None] = [] this_unnamed_cols = [] for i, c in enumerate(line): diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index d96a39431e681..45f9fbbd0abb5 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -1,6 +1,7 @@ """ Module contains tools for processing files into DataFrames or other objects """ +from __future__ import annotations from collections import abc import csv @@ -1046,7 +1047,7 @@ def TextParser(*args, **kwds): def _clean_na_values(na_values, keep_default_na=True): - na_fvalues: Union[Set, Dict] + na_fvalues: Set | Dict if na_values is None: if keep_default_na: na_values = STR_NA_VALUES @@ -1097,7 +1098,7 @@ def _floatify_na_values(na_values): def _stringify_na_values(na_values): """ return a stringified and numeric for these values """ - result: List[Union[int, str, float]] = [] + result: List[int | str | float] = [] for x in na_values: result.append(str(x)) result.append(x) From d008e2d7985624c89caf8716ccc3f048747f832f Mon Sep 17 00:00:00 2001 From: phofl Date: Fri, 29 Jan 2021 21:58:14 +0100 Subject: [PATCH 3/4] Fix annotations --- pandas/io/parsers/base_parser.py | 4 ++-- pandas/io/parsers/python_parser.py | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index 59b72aad4d592..d888f73cf0995 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -348,7 +348,7 @@ def _maybe_dedup_names(self, names): # would be nice! if self.mangle_dupe_cols: names = list(names) # so we can index - counts: DefaultDict[int | str, int] = defaultdict(int) + counts: DefaultDict[int | str | tuple, int] = defaultdict(int) is_potential_mi = _is_potential_multi_index(names, self.index_col) for i, col in enumerate(names): @@ -558,7 +558,7 @@ def _convert_to_ndarrays( return result def _set_noconvert_dtype_columns( - self, col_indices: List[int], names: List[int | str] + self, col_indices: List[int], names: List[int | str | tuple] ) -> Set[int]: """ Set the columns that should not undergo dtype conversions. diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index 948166e11b6fd..e7bbcc41f8bff 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -120,7 +120,7 @@ def __init__(self, f: Union[FilePathOrBuffer, List], **kwds): self.columns = self.columns[0] # get popped off for index - self.orig_names: List[int | str] = list(self.columns) + self.orig_names: List[int | str | tuple] = list(self.columns) # needs to be cleaned/refactored # multiple date column thing turning into a real spaghetti factory From e442d6187b3cc0bb03690183d90a51feb92a4170 Mon Sep 17 00:00:00 2001 From: phofl Date: Wed, 3 Feb 2021 19:52:16 +0100 Subject: [PATCH 4/4] Roll back type annotations --- pandas/io/parsers/base_parser.py | 11 +++++------ pandas/io/parsers/python_parser.py | 12 +++++------- pandas/io/parsers/readers.py | 6 ++---- 3 files changed, 12 insertions(+), 17 deletions(-) diff --git a/pandas/io/parsers/base_parser.py b/pandas/io/parsers/base_parser.py index d888f73cf0995..8961fd0a7af06 100644 --- a/pandas/io/parsers/base_parser.py +++ b/pandas/io/parsers/base_parser.py @@ -1,5 +1,3 @@ -from __future__ import annotations - from collections import defaultdict import csv import datetime @@ -13,6 +11,7 @@ Optional, Sequence, Set, + Tuple, Union, cast, ) @@ -348,7 +347,7 @@ def _maybe_dedup_names(self, names): # would be nice! if self.mangle_dupe_cols: names = list(names) # so we can index - counts: DefaultDict[int | str | tuple, int] = defaultdict(int) + counts: DefaultDict[Union[int, str, Tuple], int] = defaultdict(int) is_potential_mi = _is_potential_multi_index(names, self.index_col) for i, col in enumerate(names): @@ -558,7 +557,7 @@ def _convert_to_ndarrays( return result def _set_noconvert_dtype_columns( - self, col_indices: List[int], names: List[int | str | tuple] + self, col_indices: List[int], names: List[Union[int, str, Tuple]] ) -> Set[int]: """ Set the columns that should not undergo dtype conversions. @@ -577,7 +576,7 @@ def _set_noconvert_dtype_columns( ------- A set of integers containing the positions of the columns not to convert. """ - usecols: List[int] | List[str] | None + usecols: Optional[Union[List[int], List[str]]] noconvert_columns = set() if self.usecols_dtype == "integer": # A set of integers will be converted to a list in @@ -859,7 +858,7 @@ def _clean_index_names(self, columns, index_col, unnamed_cols): return [None] * len(index_col), columns, index_col cp_cols = list(columns) - index_names: List[int | str | None] = [] + index_names: List[Optional[Union[int, str]]] = [] # don't mutate index_col = list(index_col) diff --git a/pandas/io/parsers/python_parser.py b/pandas/io/parsers/python_parser.py index e7bbcc41f8bff..223acdea80ca6 100644 --- a/pandas/io/parsers/python_parser.py +++ b/pandas/io/parsers/python_parser.py @@ -1,11 +1,9 @@ -from __future__ import annotations - from collections import abc, defaultdict import csv from io import StringIO import re import sys -from typing import DefaultDict, Iterator, List, Optional, Set, cast +from typing import DefaultDict, Iterator, List, Optional, Set, Tuple, cast import numpy as np @@ -120,7 +118,7 @@ def __init__(self, f: Union[FilePathOrBuffer, List], **kwds): self.columns = self.columns[0] # get popped off for index - self.orig_names: List[int | str | tuple] = list(self.columns) + self.orig_names: List[Union[int, str, Tuple]] = list(self.columns) # needs to be cleaned/refactored # multiple date column thing turning into a real spaghetti factory @@ -334,7 +332,7 @@ def _infer_columns(self): names = self.names num_original_columns = 0 clear_buffer = True - unnamed_cols: Set[int | str | None] = set() + unnamed_cols: Set[Optional[Union[int, str]]] = set() if self.header is not None: header = self.header @@ -348,7 +346,7 @@ def _infer_columns(self): have_mi_columns = False header = [header] - columns: List[List[int | str | None]] = [] + columns: List[List[Optional[Union[int, str]]]] = [] for level, hr in enumerate(header): try: line = self._buffered_line() @@ -377,7 +375,7 @@ def _infer_columns(self): line = self.names[:] - this_columns: List[int | str | None] = [] + this_columns: List[Optional[Union[int, str]]] = [] this_unnamed_cols = [] for i, c in enumerate(line): diff --git a/pandas/io/parsers/readers.py b/pandas/io/parsers/readers.py index d8fbb20f65782..d547bfbfb3895 100644 --- a/pandas/io/parsers/readers.py +++ b/pandas/io/parsers/readers.py @@ -1,8 +1,6 @@ """ Module contains tools for processing files into DataFrames or other objects """ -from __future__ import annotations - from collections import abc import csv import sys @@ -1052,7 +1050,7 @@ def TextParser(*args, **kwds): def _clean_na_values(na_values, keep_default_na=True): - na_fvalues: Set | Dict + na_fvalues: Union[Set, Dict] if na_values is None: if keep_default_na: na_values = STR_NA_VALUES @@ -1103,7 +1101,7 @@ def _floatify_na_values(na_values): def _stringify_na_values(na_values): """ return a stringified and numeric for these values """ - result: List[int | str | float] = [] + result: List[Union[int, str, float]] = [] for x in na_values: result.append(str(x)) result.append(x)