[Python-3000] Why isinstance() and issubclass() don't need to be unforgeable (original) (raw)

Phillip J. Eby pje at telecommunity.com
Tue May 1 18:27:50 CEST 2007


I just wanted to throw in a note for those who are upset with the idea that classes should be able to decide how isinstance() and issubclass() work. If you want "true, unforgeable" isinstance and subclass, you can still use these formulas:

def true_issubclass(C1, C2): return C2 in type.mro.get(C1)

def isinstance_no_proxy(o, C): return true_issubclass(type(o), C)

def isinstance_with_proxy(o, C): cls = getattr(o, 'class', None) return true_issubclass(cls, C) or isinstance_no_proxy(o, C)

Their complexity reflects the fact that they rely on implementation details which the vast majority of code should not care about.

So, if you really have a need to find out whether something is truly an instance of something for structural reasons, you will still be able to do that. Yes, it will be a pain. But deliberately inducing structural dependencies should be painful, because you're making it painful for the users of your code, whenever you impose isinstance/issubclass checks beyond necessity.

The fact that it's currently not painful, is precisely what makes it such a good idea to add the new hooks to make these operations forgeable.

The default, in other words, should not be to care about what objects are, only what they claim to be.



More information about the Python-3000 mailing list