This is a very good point. Perhaps we can come up with a way to make isinstance and issubclass into something like GFs (without requiring the whole GF machinery).
I'll think about it some more. --Guido On 4/25/07, Jim Jewett <[EMAIL PROTECTED]> 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. > > Short of allowing more __bases__ surgery, we need a function parallel > to isinstance, which at least makes 3rd-party registration possible. > I suspect Phillip will say that we really need to make the ABCs > generic functions... but I disagree; I'm not sure that 3rd-party > adapters should even be allowed by default, but it *should* be simple > to create an ABC that does take them. > > Perhaps > > def isexample(obj, ABC): > for cls in obj.__class__.__mro__: > result = ABC.meets(obj, cls) > if result: > return result > return False > > class Abstract... > > # override this with a dictionary to allow 3rd-party registration > _good_enough = () > > @classmethod > def meets(cls, obj=None, objclass=None): > if objclass is cls: # covers isinstance > return obj > if objclass in cls._good_enough: # Nothing is, by default > return cls._good_enough.[objclass](obj) > > @classmethod > def assert_sufficient(cls, objclass, adapter): > cls[objclass]=adapter > > > On 4/25/07, Jeffrey Yasskin <[EMAIL PROTECTED]> wrote: > > > If someone needs to split them later, they can use code like:: > > import numbers > > class IntegralDomain(Ring): ... > > numbers.Integral.__bases__ = (IntegralDomain,) + > > numbers.Integral.__bases__ > > This only works with old-style classes, which are going away. > > >>> class Abstract1(object): pass > >>> class Abstract2(object): pass > >>> Abstract1.__bases__ = (Abstract2,) + Abstract1.__bases__ > > Traceback (most recent call last): > File "<pyshell#33>", line 1, in <module> > Abstract1.__bases__ = (Abstract2,) + Abstract1.__bases__ > TypeError: __bases__ assignment: 'Abstract2' deallocator differs from 'object' > _______________________________________________ > Python-3000 mailing list > Python-3000@python.org > http://mail.python.org/mailman/listinfo/python-3000 > Unsubscribe: > http://mail.python.org/mailman/options/python-3000/guido%40python.org > -- --Guido van Rossum (home page: http://www.python.org/~guido/) _______________________________________________ Python-3000 mailing list Python-3000@python.org http://mail.python.org/mailman/listinfo/python-3000 Unsubscribe: http://mail.python.org/mailman/options/python-3000/archive%40mail-archive.com