Skip to content

AssertionError on hasattr(FanoutCache(), 'foo') #353

Description

@eykd

When using the pympler memory profiler's panel for Django debug toolbar, I frequently get this error/traceback:

Django Version: 5.2.7
Python Version: 3.12.11

Traceback (most recent call last):
  File "[redacted]/.venv/lib/python3.12/site-packages/django/core/handlers/exception.py", line 55, in inner
    response = get_response(request)
               ^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/middleware.py", line 122, in __call__
    response = toolbar.process_request(request)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/timer.py", line 65, in process_request
    return super().process_request(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/headers.py", line 48, in process_request
    return super().process_request(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/debug_toolbar/panels/__init__.py", line 214, in process_request
    return self.get_response(request)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/panels.py", line 71, in process_request
    self._tracker.create_snapshot('after')
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/classtracker.py", line 572, in create_snapshot
    tobj.track_size(timestamp, sizer)
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/classtracker.py", line 135, in track_size
    (ts, sizer.asized(obj, detail=self._resolution_level))
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1944, in asized
    t = self._sizes(objs, Asized)
        ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1917, in _sizes
    s[i] = self._sizer(o, 0, 0, sized)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1888, in _sizer
    s += z(o, i, d, None)
         ^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 1887, in _sizer
    for o in v.refs(obj, False):
             ^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 574, in _refs
    for a, o in _dir2(obj, **kwds):
                ^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/pympler/asizeof.py", line 346, in _dir2
    if hasattr(obj, slots):
       ^^^^^^^^^^^^^^^^^^^
  File "[redacted]/.venv/lib/python3.12/site-packages/diskcache/fanout.py", line 66, in __getattr__
    assert valid_name, 'cannot access {} in cache shard'.format(name)
           ^^^^^^^^^^

Exception Type: AssertionError at /99101/
Exception Value: cannot access __slots__ in cache shard

Raising AttributeError instead of AssertionError will allow hasattr() to work correctly:

In [5]: class Foo:
   ...:     def __getattr__(self, name):
   ...:         raise AttributeError
   ...:

In [6]: hasattr(Foo(), '__slots__')
Out[6]: False

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions