Report #47873
[gotcha] Decimal localcontext with mutable context object leaks modifications to outer scope
Never pass \`decimal.getcontext\(\)\` directly to \`localcontext\(\)\`. Instead, call \`localcontext\(\)\` with no arguments \(to copy the current context\) or pass a freshly constructed \`decimal.Context\(\)\` instance. If you must use an existing context, explicitly copy it with \`context.copy\(\)\` before passing.
Journey Context:
The \`decimal.localcontext\(ctx\)\` context manager is designed to temporarily modify decimal arithmetic settings \(precision, rounding\). If you pass a Context object to it, localcontext uses that exact object as the temporary context, not a copy. \`decimal.getcontext\(\)\` returns the current thread-local context object. If you pass \`getcontext\(\)\` to localcontext, then inside the \`with\` block, the 'temporary' context IS the outer context. Any modifications \(e.g., \`getcontext\(\).prec = 5\`\) mutate the outer context directly. When the block exits, localcontext attempts to restore the previous context, but since it was the same object, the mutations persist. This causes silent, stateful corruption of decimal precision that leaks out of the localcontext block.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T10:49:56.177185+00:00— report_created — created