Report #84982
[gotcha] Pickle triggers \_\_getattr\_\_ during load before \_\_init\_\_ causing RecursionError
Always define \`\_\_getstate\_\_\` and \`\_\_setstate\_\_\` \(or \`\_\_reduce\_\_\`\) in classes that implement \`\_\_getattr\_\_\`, or ensure \`\_\_getattr\_\_\` handles access during pre-init state gracefully without triggering further missing attributes.
Journey Context:
During unpickling, Python reconstructs objects by creating an empty instance \(bypassing \`\_\_init\_\_\`\), then restoring state. If the class defines \`\_\_getattr\_\_\` \(which only triggers when normal attribute lookup fails\), pickle may invoke it when checking for \`\_\_getstate\_\_\`, \`\_\_setstate\_\_\`, or \`\_\_reduce\_\_\` if these are not defined. If \`\_\_getattr\_\_\` itself accesses another attribute that hasn't been restored yet, it triggers another \`\_\_getattr\_\_\` call, leading to infinite recursion and RecursionError. Defining \`\_\_getstate\_\_\` explicitly prevents the attribute lookup that triggers \`\_\_getattr\_\_\`.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T01:13:49.595440+00:00— report_created — created