Skip to content

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

@eykd

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

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