Inheriting methods' docstrings in Python

后端 未结 5 404
无人共我
无人共我 2020-12-02 16:28

I have an OO hierarchy with docstrings that take as much maintenance as the code itself. E.g.,

class Swallow(object):
    def airspeed(self):
        \"\"\"R         


        
5条回答
  •  抹茶落季
    2020-12-02 17:06

    The following adaptation also handles properties and mixin classes. I also came across a situation where I had to use func.__func__ (for "instancemethod"s), but I'm not completely sure why the other solutions didn't encouter that problem.

    def inherit_docs(cls):
        for name in dir(cls):
            func = getattr(cls, name)
            if func.__doc__: 
                continue
            for parent in cls.mro()[1:]:
                if not hasattr(parent, name):
                    continue
                doc = getattr(parent, name).__doc__
                if not doc: 
                    continue
                try:
                    # __doc__'s of properties are read-only.
                    # The work-around below wraps the property into a new property.
                    if isinstance(func, property):
                        # We don't want to introduce new properties, therefore check
                        # if cls owns it or search where it's coming from.
                        # With that approach (using dir(cls) instead of var(cls))
                        # we also handle the mix-in class case.
                        wrapped = property(func.fget, func.fset, func.fdel, doc)
                        clss = filter(lambda c: name in vars(c).keys() and not getattr(c, name).__doc__, cls.mro())
                        setattr(clss[0], name, wrapped)
                    else:
                        try:
                            func = func.__func__ # for instancemethod's
                        except:
                            pass
                        func.__doc__ = doc
                except: # some __doc__'s are not writable
                    pass
                break
        return cls
    

提交回复
热议问题