diff --git a/pandas/io/excel/_base.py b/pandas/io/excel/_base.py index 40007a0abe233..030ae9fefda98 100644 --- a/pandas/io/excel/_base.py +++ b/pandas/io/excel/_base.py @@ -945,9 +945,9 @@ class ExcelWriter(metaclass=abc.ABCMeta): # - Mandatory # - ``write_cells(self, cells, sheet_name=None, startrow=0, startcol=0)`` # --> called to write additional DataFrames to disk - # - ``supported_extensions`` (tuple of supported extensions), used to + # - ``_supported_extensions`` (tuple of supported extensions), used to # check that engine supports the given extension. - # - ``engine`` - string that gives the engine name. Necessary to + # - ``_engine`` - string that gives the engine name. Necessary to # instantiate class directly and bypass ``ExcelWriterMeta`` engine # lookup. # - ``save(self)`` --> called to save file to disk @@ -961,6 +961,10 @@ class ExcelWriter(metaclass=abc.ABCMeta): # You also need to register the class with ``register_writer()``. # Technically, ExcelWriter implementations don't need to subclass # ExcelWriter. + + _engine: str + _supported_extensions: tuple[str, ...] + def __new__( cls, path: FilePath | WriteExcelBuffer | ExcelWriter, @@ -983,7 +987,6 @@ def __new__( ) # only switch class if generic(ExcelWriter) - if cls is ExcelWriter: if engine is None or (isinstance(engine, str) and engine == "auto"): if isinstance(path, str): @@ -1027,16 +1030,14 @@ def __new__( _path = None @property - @abc.abstractmethod - def supported_extensions(self) -> tuple[str, ...] | list[str]: + def supported_extensions(self) -> tuple[str, ...]: """Extensions that writer engine supports.""" - pass + return self._supported_extensions @property - @abc.abstractmethod def engine(self) -> str: """Name of engine.""" - pass + return self._engine @property @abc.abstractmethod @@ -1292,12 +1293,7 @@ def check_extension(cls, ext: str) -> Literal[True]: """ if ext.startswith("."): ext = ext[1:] - # error: "Callable[[ExcelWriter], Any]" has no attribute "__iter__" (not - # iterable) - if not any( - ext in extension - for extension in cls.supported_extensions # type: ignore[attr-defined] - ): + if not any(ext in extension for extension in cls._supported_extensions): raise ValueError(f"Invalid extension for engine '{cls.engine}': '{ext}'") else: return True diff --git a/pandas/io/excel/_odswriter.py b/pandas/io/excel/_odswriter.py index 4f127f7c2f867..f5367df6f228d 100644 --- a/pandas/io/excel/_odswriter.py +++ b/pandas/io/excel/_odswriter.py @@ -25,8 +25,8 @@ class ODSWriter(ExcelWriter): - engine = "odf" - supported_extensions = (".ods",) + _engine = "odf" + _supported_extensions = (".ods",) def __init__( self, diff --git a/pandas/io/excel/_openpyxl.py b/pandas/io/excel/_openpyxl.py index af0ae29a76988..6d70b3f319f37 100644 --- a/pandas/io/excel/_openpyxl.py +++ b/pandas/io/excel/_openpyxl.py @@ -36,8 +36,8 @@ class OpenpyxlWriter(ExcelWriter): - engine = "openpyxl" - supported_extensions = (".xlsx", ".xlsm") + _engine = "openpyxl" + _supported_extensions = (".xlsx", ".xlsm") def __init__( self, diff --git a/pandas/io/excel/_util.py b/pandas/io/excel/_util.py index 6be5ef0f64e16..c315657170a97 100644 --- a/pandas/io/excel/_util.py +++ b/pandas/io/excel/_util.py @@ -41,9 +41,7 @@ def register_writer(klass: ExcelWriter_t) -> None: """ if not callable(klass): raise ValueError("Can only register callables as engines") - engine_name = klass.engine - # for mypy - assert isinstance(engine_name, str) + engine_name = klass._engine _writers[engine_name] = klass diff --git a/pandas/io/excel/_xlsxwriter.py b/pandas/io/excel/_xlsxwriter.py index f789378720613..302d0281019f5 100644 --- a/pandas/io/excel/_xlsxwriter.py +++ b/pandas/io/excel/_xlsxwriter.py @@ -169,8 +169,8 @@ def convert(cls, style_dict, num_format_str=None): class XlsxWriter(ExcelWriter): - engine = "xlsxwriter" - supported_extensions = (".xlsx",) + _engine = "xlsxwriter" + _supported_extensions = (".xlsx",) def __init__( self, diff --git a/pandas/io/excel/_xlwt.py b/pandas/io/excel/_xlwt.py index 5f723da61dde4..234d9e72de10d 100644 --- a/pandas/io/excel/_xlwt.py +++ b/pandas/io/excel/_xlwt.py @@ -25,8 +25,8 @@ class XlwtWriter(ExcelWriter): - engine = "xlwt" - supported_extensions = (".xls",) + _engine = "xlwt" + _supported_extensions = (".xls",) def __init__( self, diff --git a/pandas/tests/io/excel/test_writers.py b/pandas/tests/io/excel/test_writers.py index 5b46c0baac165..de855fa30b88d 100644 --- a/pandas/tests/io/excel/test_writers.py +++ b/pandas/tests/io/excel/test_writers.py @@ -1313,8 +1313,8 @@ class DummyClass(ExcelWriter): called_save = False called_write_cells = False called_sheets = False - supported_extensions = ["xlsx", "xls"] - engine = "dummy" + _supported_extensions = ("xlsx", "xls") + _engine = "dummy" def book(self): pass