1from collections import deque
2
3
4class Slot:
5 def __init__(self, object_limit=None, size_limit=None):
6 self.object_limit = object_limit
7 self.size_limit = size_limit
8 self.name = None
9
10 def __set_name__(self, owner, name):
11 self.name = f"_slot_{name}"
12
13 def _get_queue(self, instance):
14 if not hasattr(instance, self.name):
15 setattr(instance, self.name, deque())
16 return getattr(instance, self.name)
17
18 def __get__(self, instance, owner):
19 if instance is None:
20 return self
21 return tuple(self._get_queue(instance))
22
23 def __set__(self, instance, value):
24 q = self._get_queue(instance)
25
26 if self.object_limit is not None and len(q) + 1 > self.object_limit:
27 raise ValueError("Object limit exceeded")
28
29 if self.size_limit is not None:
30 current_size = sum(len(x) for x in q)
31 if current_size + len(value) > self.size_limit:
32 raise ValueError("Size limit exceeded")
33
34 q.append(value)
35
36 def __delete__(self, instance):
37 q = self._get_queue(instance)
38 if q:
39 q.popleft()
.......
----------------------------------------------------------------------
Ran 7 tests in 0.000s
OK