diff --git a/backend/record.py b/backend/record.py index b9a913f..43b9424 100644 --- a/backend/record.py +++ b/backend/record.py @@ -79,7 +79,17 @@ def _get_sigfig_formatted_value(self, attr): return v def __getattr__(self, attr): - v = self._payload.get(attr) + # Guard against recursion when the instance has no _payload yet — e.g. + # during unpickling, when pickle probes getattr(obj, "__setstate__") + # before __dict__ is restored. Reading via __dict__ (not self._payload) + # avoids re-entering __getattr__, and dunder lookups raise cleanly so + # pickle falls back to its default state restore. + if attr.startswith("__") and attr.endswith("__"): + raise AttributeError(attr) + payload = self.__dict__.get("_payload") + if payload is None: + raise AttributeError(attr) + v = payload.get(attr) if v is None and self.defaults: v = self.defaults.get(attr) return v