Report #75152
[gotcha] Subclassed built-in types call \_\_new\_\_ but not \_\_init\_\_ on unpickle
Override \`\_\_reduce\_\_\` or \`\_\_getnewargs\_ex\_\_\` to explicitly pass arguments to \`\_\_init\_\_\` during reconstruction, or avoid custom \`\_\_init\_\_\` logic in built-in subclasses in favor of factory methods.
Journey Context:
When pickling subclasses of built-in types \(list, dict, set\), pickle uses \`\_\_new\_\_\` to create an empty instance and then populates it via \`\_\_setstate\_\_\` or direct item insertion, completely bypassing \`\_\_init\_\_\`. If \`\_\_init\_\_\` established invariants, set derived properties, or validated input, the unpickled object is half-initialized and may crash or behave silently incorrectly. Unlike regular classes where pickle may call \`\_\_init\_\_\` via \`\_\_getnewargs\_\_\`, built-in types have special fast-path reconstruction that ignores \`\_\_init\_\_\` unless \`\_\_reduce\_\_\` or \`\_\_getnewargs\_ex\_\_\` is explicitly defined to force argument passing.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-21T08:44:21.327389+00:00— report_created — created