| f | from itertools import product | f | from itertools import product |
| import string | | import string |
| | | |
| def slotgen(number): | | def slotgen(number): |
| | | |
| n | def decor(cls): | n | def decorator(cls): |
| orig_at = {i: j for i, j in cls.__dict__.items() if not i.starts | | orig_attrs = {k: v for k, v in cls.__dict__.items() if not k.sta |
| with('__')} | | rtswith('__')} |
| let = string.ascii_lowercase | | letters = string.ascii_lowercase |
| l = 1 | | L = 1 |
| while len(let) ** l < number: | | while len(letters) ** L < number: |
| l += 1 | | L += 1 |
| names = (''.join(i) for i in product(let, repeat=l)) | | names = (''.join(p) for p in product(letters, repeat=L)) |
| slots = [next(names) for _ in range(number)] | | slots = [next(names) for _ in range(number)] |
| n | new_at = dict(cls.__dict__) | n | new_attrs = dict(cls.__dict__) |
| for name in slots: | | for name in slots: |
| t | if name in new_at: | t | if name in new_attrs: |
| del new_at[name] | | del new_attrs[name] |
| new_at['__slots__'] = slots | | new_attrs['__slots__'] = slots |
| new_at.pop('__dict__', None) | | new_attrs.pop('__dict__', None) |
| new_at.pop('__weakref__', None) | | new_attrs.pop('__weakref__', None) |
| for i, j in orig_at.items(): | | for k, v in orig_attrs.items(): |
| if i not in slots: | | if k not in slots: |
| new_at[i] = j | | new_attrs[k] = v |
| return type(cls.__name__, cls.__bases__, new_at) | | return type(cls.__name__, cls.__bases__, new_attrs) |
| return decor | | return decorator |