[Python-3000] ABC PEP isinstance issue Was: PEP 31XX: A Type Hierarchy for Numbers (and other algebraic entities)

Guido van Rossum guido at python.org
Thu Apr 26 22:25:28 CEST 2007

On 4/25/07, Jim Jewett <jimjjewett at gmail.com> wrote:
> The current ABC proposal is to use isinstance as the test; Jeffrey
> Yaskin's numbers PEP highlighted the weakness there with a concrete
> example.
> If you need to an abstraction less powerful than an existing ABC,
> you're out of luck; you can't just assert that the existing class is
> already sufficient, nor can you expect everyone else to use multiple
> annotations.

I now have a proposal to allow overloading isinstance() and
issubclass(), by defining special (class) methods on the second
argument. See http://python.org/sf/1708353. Does this need a PEP? The
unit test shows that it can be used to support the use case described

class ABC(type):

    def __instancecheck__(cls, inst):
        """Implement isinstance(inst, cls)."""
        return any(cls.__subclasscheck__(c)
                   for c in {type(inst), inst.__class__})

    def __subclasscheck__(cls, sub):
        """Implement issubclass(sub, cls)."""
        candidates = cls.__dict__.get("__subclass__", set())
        return any(c in candidates for c in sub.mro())

class Integer(metaclass=ABC):

    __subclass__ = {int}

--Guido van Rossum (home page: http://www.python.org/~guido/)

More information about the Python-3000 mailing list