john wrote: > Why do c.f and C.__dict__['f'].__get__(c,C) compare as equal under == > but not under *is* ?
These variations are equivalent. Every attribute access gives you a new bound method: >>> class C(object): ... def f(self): pass ... >>> c = C() >>> c.f is c.f False >>> c.f == c.f True 'a is b' is true only when the names a and b are bound to the same object. For bound methods, c.f is c.f == True would mean that Python would have to cache them, and I don't see a potential advantage of that. 'a == b' on the other hand does what the programmer specifies: >>> class Str(str): ... def __eq__(self, other): return True ... >>> Str("black") == Str("blue") True It makes sense for bound methods to compare equal if they refer to the same function and instance (though I don't know if the class is checked, too). Peter -- http://mail.python.org/mailman/listinfo/python-list