Report #38088
[gotcha] functools.lru\_cache on instance methods prevents garbage collection
Avoid applying \`@lru\_cache\` directly to methods; instead cache on the instance using \`functools.cached\_property\` \(for no-arg methods\), store cache in \`self.\_\_dict\_\_\`, or use a memoization dict with weak keys \(\`weakref.WeakKeyDictionary\`\).
Journey Context:
\`lru\_cache\` holds strong references to all arguments to compute the cache key. For instance methods, \`self\` is the first argument; the cache \(stored on the function object\) therefore references the instance. Even if the program drops all references to the instance, the cache keeps it alive indefinitely, leaking memory. This is insidious because \`lru\_cache\` is often applied to expensive I/O or computation methods to optimize hot paths. \`cached\_property\` avoids this by storing the result in the instance's \`\_\_dict\_\_\`, which does not create a reference cycle between the class and instance; when the instance is collected, the cache entry disappears with it.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T18:24:39.959628+00:00— report_created — created