diff --git a/pandas/io/sas/sas7bdat.py b/pandas/io/sas/sas7bdat.py index d47dd2c71b86f..2bfcd500ee239 100644 --- a/pandas/io/sas/sas7bdat.py +++ b/pandas/io/sas/sas7bdat.py @@ -26,6 +26,7 @@ from pandas.io.common import get_filepath_or_buffer from pandas.io.sas._sas import Parser import pandas.io.sas.sas_constants as const +from pandas.io.sas.sasreader import ReaderBase class _subheader_pointer: @@ -37,7 +38,7 @@ class _column: # SAS7BDAT represents a SAS data file in SAS7BDAT format. -class SAS7BDATReader(abc.Iterator): +class SAS7BDATReader(ReaderBase, abc.Iterator): """ Read SAS files in SAS7BDAT format. diff --git a/pandas/io/sas/sas_xport.py b/pandas/io/sas/sas_xport.py index 85b7fd497cedd..7fc1bc6d3eb6c 100644 --- a/pandas/io/sas/sas_xport.py +++ b/pandas/io/sas/sas_xport.py @@ -19,6 +19,7 @@ import pandas as pd from pandas.io.common import get_filepath_or_buffer +from pandas.io.sas.sasreader import ReaderBase _correct_line1 = ( "HEADER RECORD*******LIBRARY HEADER RECORD!!!!!!!" @@ -239,7 +240,7 @@ def _parse_float_vec(vec): return ieee -class XportReader(abc.Iterator): +class XportReader(ReaderBase, abc.Iterator): __doc__ = _xport_reader_doc def __init__( diff --git a/pandas/io/sas/sasreader.py b/pandas/io/sas/sasreader.py index 27d56d4ede403..6ebcaf6b72c45 100644 --- a/pandas/io/sas/sasreader.py +++ b/pandas/io/sas/sasreader.py @@ -1,9 +1,27 @@ """ Read SAS sas7bdat or xport files. """ + +from abc import ABCMeta, abstractmethod + from pandas.io.common import stringify_path +# TODO: replace with Protocol in Python 3.8 +class ReaderBase(metaclass=ABCMeta): + """ + Protocol for XportReader and SAS7BDATReader classes. + """ + + @abstractmethod + def read(self, nrows=None): + pass + + @abstractmethod + def close(self): + pass + + def read_sas( filepath_or_buffer, format=None, @@ -62,6 +80,7 @@ def read_sas( else: raise ValueError("unable to infer format of SAS file") + reader: ReaderBase if format.lower() == "xport": from pandas.io.sas.sas_xport import XportReader diff --git a/setup.cfg b/setup.cfg index f7370b6cef8d6..79fe68b7e2dfe 100644 --- a/setup.cfg +++ b/setup.cfg @@ -291,9 +291,6 @@ check_untyped_defs=False [mypy-pandas.io.sas.sas7bdat] check_untyped_defs=False -[mypy-pandas.io.sas.sasreader] -check_untyped_defs=False - [mypy-pandas.io.stata] check_untyped_defs=False