validating a class against an ABC at definition time

Eric Snow ericsnowcurrently at gmail.com
Fri May 20 18:55:49 EDT 2011


On Thu, May 19, 2011 at 11:33 PM, Eric Snow <ericsnowcurrently at gmail.com>wrote:

> Thinking about class APIs and validating a class against an API.  The abc
> module provides the tools to do some of this.  One thing I realized, that I
> hadn't noticed before, is that the abstractness of a class is measured when
> instances of the class are created.  This happens in object.__new__
> (pyobject.c).  Validating thus when a class is defined would not be as
> helpful, since there is no guarantee that the class is not meant to be
> abstract as well.
>
> However, I have found that it is sometimes nice to validate a class at
> definition time.  This is particularly true for a class that does not
> inherit from the abstract base class (but registers instead).
>
> Taking cues from abc.py and pyobject.c, here is a stab at a class decorator
> that validates a class against another.
>
> def validate(abc):
>     if not isinstance(abc, type):
>         raise TypeError("Can only validate against classes")
>     def decorator(cls):
>         if not __debug__:
>             return cls
>         if not isinstance(cls, type):
>             raise TypeError("Can only validate classes")
>         abstracts = set()
>         for name in getattr(abc, "__abstractmethods__", set()):
>             value = getattr(cls, name, None)
>             if not value:
>                 abstracts.add(name)
>             elif getattr(value, "__isabstractmethod__", False):
>                 abstracts.add(name)
>         if abstracts:
>             sorted_methods = sorted(abstracts)
>             joined = ", ".join(sorted_methods)
>             msg = "Class {} does not implement abstract methods {} of class
> {}"
>             raise TypeError(msg.format(cls.__name__, joined, abc.__name__))
>         return cls
>     return decorator
>
> Stack this with the ABCMeta.register method and you can ensure that your
> class is compliant with the ABC at the time you register it on that ABC.
>
> Does anyone find this irrelevant or superfluous?  I know that it would be a
> good idea to stay on top of your class's implementation of an ABC's abstract
> methods.  However, this seems like a good way of doing that
> programmatically.
>
> Does anyone know a better way to do ABC validation at definition time?
>
> Thanks.
>
> -eric
>
>
>
>
>
I have revised this and made a recipe for it:

http://code.activestate.com/recipes/577711-validating-classes-and-objects-against-an-abstract/

The question remains of what alternatives exist to this solution.  Thanks!

-eric
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-list/attachments/20110520/b67b863f/attachment-0001.html>


More information about the Python-list mailing list