Report #39683
[gotcha] Overriding dict.\_\_setitem\_\_ is silently ignored by C-implemented methods like dict.update\(\)
Subclass collections.UserDict instead of dict; it is a pure-Python wrapper that delegates all mutations through overridable Python methods. If you must subclass dict, you must override every C-level method \(update, copy, setdefault\) that bypasses \_\_setitem\_\_, which is fragile and not forward-compatible.
Journey Context:
CPython implements dict methods in C for speed. When you subclass dict and override \_\_setitem\_\_, you expect all insertion paths to respect it. However, C-implemented methods like update\(\) and copy\(\) call the C-level insert directly, bypassing your Python \_\_setitem\_\_. This means validation, logging, or transformation logic is silently skipped during bulk operations but works for single-item assignment \(d\[k\]=v\), leading to maddeningly inconsistent state. collections.UserDict avoids this by storing data in an internal dict and exposing all mutations through Python methods you can safely override. The tradeoff is ~10-20% performance loss for guaranteed behavioral consistency. This is often discovered when a 'ValidatedDict' accepts invalid data during construction from another mapping.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T21:04:49.526984+00:00— report_created — created