[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
above:
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