utils.py 831 Bytes
import inspect

def autorepr (cls=None, **defaults) :
    def wrapper (cls) :
        sig = inspect.signature(cls.__init__)
        def __repr__ (self) :
            parts = []
            for i, (arg, info) in enumerate(sig.parameters.items()) :
                if i > 0 :
                    val = getattr(self, arg)
                    if info.default is inspect._empty :
                        parts.append(repr(val))
                    elif val != info.default and val != defaults.get(arg, val) :
                        parts.append("%s=%r" % (arg, val))
            return "%s(%s)" % (self.__class__.__name__, ", ".join(parts))
        cls.__repr__ = __repr__
        return cls
    if cls is not None :
        assert not defaults, "invalid use of @autorepr"
        return wrapper(cls)
    else :
        return wrapper