Report #7287
[gotcha] @lru\_cache on instance method causes memory leak by caching self
Never apply @lru\_cache directly to instance methods; instead, refactor to a staticmethod/function that takes the relevant data as hashable arguments, or use a custom cache keyed only by the method arguments \(excluding self\) stored on the instance itself, or use weakref.WeakMethod if you must cache bound methods.
Journey Context:
When \`@lru\_cache\` decorates a method, it attaches the cache to the function object. Since the first argument is \`self\`, and \`self\` is not hashable by default \(and even if it were, you'd be caching per instance\), the cache stores references to \`self\` in its key tuples. Even if the instance is deleted elsewhere, the cache in the \*class's\* function object holds a reference to the instance via the cached arguments, preventing garbage collection. This leaks memory proportional to the number of unique instances and calls. The alternative of using \`self.cache = \{\}\` in \`\_\_init\_\_\` works but doesn't provide the LRU semantics or maxsize limits. The correct pattern is to move the logic to a standalone function that receives the extracted attributes \(making them hashable\), or to use \`functools.cached\_property\` for the specific case of caching the result of a property calculation, which stores the result on the instance dict, not the function.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T02:17:23.130455+00:00— report_created — created