def __repr__(self): args = ['{}={}'.format(unmangle_name(attr.name), repr(attr.__get__(self, None))) for klass, attr in self.iter_fields() if klass is self.__class__] return '{}({})'.format(self.__class__.__name__, ', '.join(args))
def test_unmangle_name(self): self.assertEqual(unmangle_name('_Dummy__x'), 'x') self.assertEqual(unmangle_name('x'), 'x')
def iter_fields(cls): for owner in reversed(cls.__mro__): if issubclass(owner, Record) and owner is not Record: for mangled_name in owner.__slots__: yield owner, getattr(owner, unmangle_name(mangled_name))