[Python-3000] A plus for naked unbound methods
Mark Seaborn
mrs at mythic-beasts.com
Mon Oct 6 22:20:59 CEST 2008
Terry Reedy <tjreedy at udel.edu> wrote:
> Mark Seaborn wrote:
> > Terry Reedy <tjreedy at udel.edu> wrote:
> >
> >> I have seen a couple of objections to leaving unbound methods naked (as
> >> functions) when retrieved in 3.0. Here is a plus.
> >>
> >> A c.l.p poster reported that 2.6 broke his code because the addition of
> >> default rich comparisons to object turned tests like hassattr(ob,
> >> '__lt__') from False to True.
> >
> > For the record, the post is:
> > http://mail.python.org/pipermail/python-list/2008-October/510540.html
> >
> >> The obvious fix ob.__lt__ == object.__lt__ does not work because
> >> wrapping makes it always False, even when conceptually true. In
> >> 3.0, that equality test works. (I pointed him to 'object' in
> >> repr(ob.__lt__) as a workaround. Others posted others.)
> >
> > Assuming ob is an instance object,
>
> It was a class derived from object. I should have made that clearer.
It appears that unbound methods do what you want in the general case
in Python 2.5 and 2.6. It's just that __lt__ behaves unlike normal
unbound methods. So this isn't an argument against unbound methods,
it's an argument for __lt__ not to be a special case.
>>> class C(object):
... def f(self): pass
... def g(self): pass
...
>>> class D(C):
... def g(self): pass
...
>>> C.f == D.f
True
>>> C.g == D.g
False
>>> C.__str__ == D.__str__
True
>>> C.__str__ == object.__str__
True
It is slightly odd that C.f and D.f compare as equal when they are not
equivalent. It is not inconsistent with other cases where == returns
True on non-equivalent objects (such as dicts with equal content but
different identities), but it is odd for this to happen on a callable.
Mark
More information about the Python-3000
mailing list