'module data provides class Data(object)' from pprint import pformat class Data(object): "represents arbitrary data; provides functionality for displaying itself"\ " properly" def __init__(self, *args, **kwargs): if args: self.args = args for key, value in kwargs.items(): self.__dict__[key] = value self.assert_data() def __repr__(self): if 'args' in self.__dict__: args = map(repr, self.args) else: args = [] for key, value in self.__dict__.items(): if key != 'args': args.append('%s=%r' % (key, value)) return self.__class__.__name__ + '(' + (', '.join(args)) + ')' def __str__(self): return self.formatted() def assert_data(self): "to be overridden for internal asserts after creation" def stringify_arg(key, value, indent=None, variables=None): if indent is None: indent = ' ' if isinstance(value, Data): if variables is None: variables = {} keys, values = variables.keys(), variables.values() try: i = values.index(value) except ValueError: return ('%s%s = %s' % (indent, key, value.formatted(indent=indent). replace('\n', '\n%s%*s' % (indent, len(key)+3, '')))) else: return ('%s%s = %s' % (indent, key, keys[i])) else: return ('%s%s = %s' % (indent, key, pformat(value).replace('\n', '\n%s%*s' % (indent, len(key)+3, '')))) stringify_arg = staticmethod(stringify_arg) def formatted(self, indent=None, variables=None): result = [ self.__class__.__name__ + ':' ] if 'args' in self.__dict__: result.append(Data.stringify_arg('args', self.args, indent=indent, variables=variables)) for key, value in self.__dict__.items(): if key != 'args': result.append(Data.stringify_arg(key, value, indent=indent, variables=variables)) return '\n'.join(result)