| 6 | return collections.OrderedDict() |
| 7 | |
| 8 | def __new__(meta_cls, cls_name, bases, cls_dict): |
| 9 | def __init__(self, **kw): |
| 10 | for k in self.__defaults__: |
| 11 | setattr(self, k, self.__defaults__[k]) |
| 12 | for k in kw: |
| 13 | setattr(self, k, kw[k]) |
| 14 | |
| 15 | def __repr__(self): |
| 16 | rep = ['{}={!r}'.format(k, getattr(self, k)) |
| 17 | for k in self.__defaults__ |
| 18 | if getattr(self, k) != self.__defaults__[k] |
| 19 | ] |
| 20 | return '{}({})'.format(cls_name, ', '.join(rep)) |
| 21 | |
| 22 | new_dict = { '__slots__':[], |
| 23 | '__defaults__':collections.OrderedDict(), |
| 24 | '__init__':__init__, '__repr__':__repr__, } |
| 25 | |
| 26 | for k in cls_dict: |
| 27 | if k.startswith('__') and k.endswith('__'): |
| 28 | if k in new_dict: |
| 29 | warnings.warn( |
| 30 | "Can't set attr {!r} in bunch-class {!r}". |
| 31 | format(k, cls_name)) |
| 32 | else: |
| 33 | new_dict[k] = cls_dict[k] |
| 34 | else: |
| 35 | new_dict['__slots__'].append(k) |
| 36 | new_dict['__defaults__'][k] = cls_dict[k] |
| 37 | |
| 38 | return super().__new__(meta_cls, cls_name, bases, new_dict) |
| 39 | |
| 40 | class Bunch(metaclass=MetaBunch): |
| 41 | pass |