| f | class Slot: | f | class Slot: |
| def __init__(self, object_limit=None, size_limit=None): | | def __init__(self, object_limit=None, size_limit=None): |
| self.object_limit = object_limit | | self.object_limit = object_limit |
| self.size_limit = size_limit | | self.size_limit = size_limit |
| | | |
| def __set_name__(self, owner, name): | | def __set_name__(self, owner, name): |
| t | self.name = name | t | |
| self.storage_name = f"_{name}_objects" | | self.storage_name = f"_{name}_objects" |
| | | |
| def __get__(self, instance, owner): | | def __get__(self, instance, owner): |
| if instance is None: | | if instance is None: |
| return self | | return self |
| return tuple(getattr(instance, self.storage_name, [])) | | return tuple(getattr(instance, self.storage_name, [])) |
| | | |
| def __set__(self, instance, value): | | def __set__(self, instance, value): |
| if not (storage := getattr(instance, self.storage_name, [])): | | if not (storage := getattr(instance, self.storage_name, [])): |
| setattr(instance, self.storage_name, storage) # Hacky :) | | setattr(instance, self.storage_name, storage) # Hacky :) |
| if self.object_limit is not None and len(storage) + 1 > self.object_limit: | | if self.object_limit is not None and len(storage) + 1 > self.object_limit: |
| raise ValueError("Too many.") | | raise ValueError("Too many.") |
| if self.size_limit is not None and sum(len(obj) for obj in storage) + len(value) > self.size_limit: | | if self.size_limit is not None and sum(len(obj) for obj in storage) + len(value) > self.size_limit: |
| raise ValueError("Too much.") | | raise ValueError("Too much.") |
| storage.append(value) | | storage.append(value) |
| | | |
| def __delete__(self, instance): | | def __delete__(self, instance): |
| try: | | try: |
| getattr(instance, self.storage_name).pop(0) | | getattr(instance, self.storage_name).pop(0) |
| except (AttributeError, IndexError): | | except (AttributeError, IndexError): |
| pass | | pass |