container.___le___ can use only <=?
cerutti at tds.net
cerutti at tds.net
Sat Dec 15 07:54:52 EST 2007
On Dec 14, 11:04 pm, Steven D'Aprano <st... at REMOVE-THIS-
cybersource.com.au> wrote:
> On Fri, 14 Dec 2007 21:15:44 +0000, Neil Cerutti wrote:
> > When implementing the rich comparison operators for some sort of
> > container, it's tempting to save code by doing something like:
>
> > class LarchTree:
> > ...
> > def __gt__(self, other):
> > # A lot of code to traverse the tree
> > def __le__(self):
> > return not self > other
>
> > However, if I'm thinking correctly, this is a bad idea. The reasoning
> > being that > and <= are not required to be each others opposite for
> > arbitrary value types, and may not even both be supplied by the
> > contained objects.
>
> > If a LarchTree user stores objects that don't support __gt__, will he
> > have a legitimate complaint when using LarchTree.__le__ results in an
> > attribute error?
>
> I'm not sure that an AttributeError is the right exception to raise, but
> in general I'd say that if the contained objects don't support "normal"
> comparisons (that is, if < and >= aren't opposites, etc.) then all bets
> are off. "Behaviour is undefined" time.
I wasn't going to raise the exception, I was thinking about calling a
function that raised the exception.
Assume for a moment that list's __le__ were implemented as above.
class BadGT(object):
def __gt__(self, o):
raise RuntimeError("I just hate this operation")
def __le__(self, o):
return id(self) <= id(other)
>>> x = [BadGT(), BadGT()]
>>> x <= []
If lists implementation of __le__ calls __gt__ on its constituents
*then* it'll be a RuntimeError.
I've tested list, and it safely compares lists containing BadGT
objects, as along I don't call __gt__ myself. So I was contemplating
implementing a phalanx of tests along these lines, which the current
version of my container will surely fail.
> BTW, what is a LarchTree? Googling just brings up the actual botanical
> tree, a type of conifer.
>
> http://en.wikipedia.org/wiki/Larch
It was a Monty Python reference. I'm actually still fiddling around
with a doubly-linked list implementation. It's kinda embarrassing so I
hid that fact, but actually I'm learning a bunch of Python and getting
design practice from this exercise (it turns out linked lists have
keys!).
--
Neil Cerutti
More information about the Python-list
mailing list