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