Darren Dale <dsdal...@gmail.com> added the comment: On Sat, Jun 11, 2011 at 7:32 PM, Eric Snow <rep...@bugs.python.org> wrote: > > Eric Snow <ericsnowcurren...@gmail.com> added the comment: > Per your last message, if a specific descriptor has an abstract setter then > the descriptor should be considered abstract. If the implementation of that > attribute is not a descriptor should it raise a TypeError? If it is a > descriptor but it does not have a setter, should it likewise fail?
Consider a framework like Enthought's Traits or Riverbank Computing's dip, where setting the value of a descriptor can result in other objects being notified of the change. Both Traits and dip are based on the concept of interfaces, but imagine someone wanted to develop something similar based on ABCs. In that case, one could argue that replacing the descriptor with a regular attribute, or another read-only descriptor, would not satisfy the ABC specification. Then it might be nice if the abc mechanisms could catch the error. But it looks like this will be difficult in cases where the subclasses replaces the descriptor, unless perhaps an AbstractDescriptor were provided that explained how ABCMeta is going to identify abstract methods: class AbstractDescriptor(metaclass=abc.ABCMeta): @property @abc.abstractmethod def __abstractmethods__(self): # it would be nice if descriptors new their own names here, # __abstractmethods__ could return: ('bar.fget', 'bar.fset') return frozenset(m for m in ('fget', 'fset', 'fdel') if getattr(getattr(self, m, None), '__isabstractmethod__', False)) @property def __isabstractmethod__(self): return True if self.__abstractmethods__ AbstractDescriptor.register(property) Of course, not all descriptors would be required to derive from AbstractDescriptor. There is no intended stick, but the carrot is better integration with with ABCs. Having said all that, I think the above suggestion including __abstractmethods__ for descriptors makes unreasonable demands of conformity between various descriptor implementations, and that Nick's suggestion of simply asking descriptors to provide an __isabstractmethod__ descriptor is probably good enough. Sufficient documentation of an ABC's interface can cover the rest. The inspect module or something like it may still be needed in ABCMeta to work around the general issue Daniel discovered with staticmethod. That way ABCMeta could inspect the descriptors themselves and attempt to retrieve their __isabstractmethod__ value. (aside: unlike ABCMeta.__new__, ABCMeta.register makes no attempt to verify that the class being registered actually meets the specification. Why not have ABCMeta.register perform the same checks as ABCMeta.__new__, and raise an error if the registered class does not conform to the specification?) My work is going to keep me pretty busy over the next three weeks, and I'm still not accomplished with Python's C-API. If someone else wants to take a crack at the next patch, please feel free. Darren ---------- _______________________________________ Python tracker <rep...@bugs.python.org> <http://bugs.python.org/issue11610> _______________________________________ _______________________________________________ Python-bugs-list mailing list Unsubscribe: http://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com