[PEAK] Type and class adaptation
Phillip J. Eby
pje at telecommunity.com
Fri Nov 19 14:15:30 EST 2004
On my second reading, I caught a couple of things that I missed before...
At 06:21 PM 11/19/04 +0100, Radek Kanovsky wrote:
>Additionally if I declare
>adapter for MyClass, this adapter is not applicable to SubClass.
This doesn't sound right; do you have a short code sample I could use to
test this?
>def dispatch_by_subclass (klass, table):
> while True:
> if klass in table:
> return table[klass]
> try:
> klass, = klass.__bases__
This code will raise an AttributeError if it is used on a non-class.
> except ValueError:
> if klass.__bases__:
> return table.reseed(klass)
> else:
> break
> if klass in table:
> return table[object]
This last bit is also broken; it's *always* going to return None.
Essentially, the problem with your implementation as far as I can tell, is
that it doesn't at all consider the possibility that the object is not a
class. I would recommend that you use 'None' as the key for that
situation. So, the code would look something like this:
def dispatch_by_subclass (klass, table):
if isinstance(klass,ClassTypes):
while True:
if klass in table:
return table[klass]
try:
klass, = klass.__bases__
except ValueError:
if klass.__bases__:
return table.reseed(klass)
else:
break
if None in table:
return table[None]
And, the 'ISSubclass.seeds()' method should also include 'None' in its seeds.
Essentially, a dispatch function must never return 'None' unless there are
no cases registered for that situation, and an ITest must create seeds for
all the possibilities regarding that test. One of the possibilities of a
subclass test is that the object being tested is not a class, so there
needs to be a key for that condition. Also, there is the possibility that
a class is not a subclass of any known test (i.e., it's a new classic
class). In both of these cases, the 'None' key represents the default
dispatch path, which is basically a path where none of the subclass-testing
alternatives are applicable.
This is different from dispatch_by_mro, because in Python everything is an
*instance* of 'object' eventually, so 'InstanceType' and 'object' are the
default keys. But, in this case, not everything is a *subclass* of
'object', so a different default is needed.
More information about the PEAK
mailing list