Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Backport PR STYLE enable pylint: method-cache-max-size-none #49784

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion doc/source/whatsnew/v1.5.2.rst
Expand Up @@ -27,7 +27,7 @@ Fixed regressions
Bug fixes
~~~~~~~~~
- Bug in the Copy-on-Write implementation losing track of views in certain chained indexing cases (:issue:`48996`)
-
- Fixed memory leak in :meth:`.Styler.to_excel` (:issue:`49751`)

.. ---------------------------------------------------------------------------
.. _whatsnew_152.other:
Expand Down
10 changes: 9 additions & 1 deletion pandas/io/formats/excel.py
Expand Up @@ -170,10 +170,13 @@ def __init__(self, inherited: str | None = None) -> None:
self.inherited = self.compute_css(inherited)
else:
self.inherited = None
# We should avoid lru_cache on the __call__ method.
# Otherwise once the method __call__ has been called
# garbage collection no longer deletes the instance.
self._call_cached = lru_cache(maxsize=None)(self._call_uncached)

compute_css = CSSResolver()

@lru_cache(maxsize=None)
def __call__(
self, declarations: str | frozenset[tuple[str, str]]
) -> dict[str, dict[str, str]]:
Expand All @@ -193,6 +196,11 @@ def __call__(
A style as interpreted by ExcelWriter when found in
ExcelCell.style.
"""
return self._call_cached(declarations)

def _call_uncached(
self, declarations: str | frozenset[tuple[str, str]]
) -> dict[str, dict[str, str]]:
properties = self.compute_css(declarations, self.inherited)
return self.build_xlstyle(properties)

Expand Down
10 changes: 5 additions & 5 deletions pandas/tests/io/formats/test_to_excel.py
Expand Up @@ -357,7 +357,7 @@ def test_css_excel_cell_precedence(styles, expected):
"""It applies favors latter declarations over former declarations"""
# See GH 47371
converter = CSSToExcelConverter()
converter.__call__.cache_clear()
converter._call_cached.cache_clear()
css_styles = {(0, 0): styles}
cell = CssExcelCell(
row=0,
Expand All @@ -369,7 +369,7 @@ def test_css_excel_cell_precedence(styles, expected):
css_col=0,
css_converter=converter,
)
converter.__call__.cache_clear()
converter._call_cached.cache_clear()

assert cell.style == converter(expected)

Expand Down Expand Up @@ -410,7 +410,7 @@ def test_css_excel_cell_cache(styles, cache_hits, cache_misses):
"""It caches unique cell styles"""
# See GH 47371
converter = CSSToExcelConverter()
converter.__call__.cache_clear()
converter._call_cached.cache_clear()

css_styles = {(0, i): _style for i, _style in enumerate(styles)}
for css_row, css_col in css_styles:
Expand All @@ -424,8 +424,8 @@ def test_css_excel_cell_cache(styles, cache_hits, cache_misses):
css_col=css_col,
css_converter=converter,
)
cache_info = converter.__call__.cache_info()
converter.__call__.cache_clear()
cache_info = converter._call_cached.cache_info()
converter._call_cached.cache_clear()

assert cache_info.hits == cache_hits
assert cache_info.misses == cache_misses