Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

how to overload operator "< <" (a < x < b)?

2 views
Skip to first unread message

dmitrey

unread,
Aug 7, 2009, 8:00:40 AM8/7/09
to
hi all,
is it possible to overload operator "< <"? (And other like this one,
eg "<= <=", "> >", ">= >=")
Any URL/example?
Thank you in advance, D.

Diez B. Roggisch

unread,
Aug 7, 2009, 8:16:22 AM8/7/09
to

Peter Otten

unread,
Aug 7, 2009, 8:21:31 AM8/7/09
to
dmitrey wrote:

> is it possible to overload operator "< <"? (And other like this one,
> eg "<= <=", "> >", ">= >=")

No.

a < x < b

is a shortcut for

a < x and x < b

where x is of course evaluated only once.

Peter


Benjamin Kaplan

unread,
Aug 7, 2009, 8:50:52 AM8/7/09
to pytho...@python.org

That isn't an operator at all. Python does not support compound
comparisons like that. You have to do "a > b and b > c".
> --
> http://mail.python.org/mailman/listinfo/python-list
>

alex23

unread,
Aug 7, 2009, 9:48:20 AM8/7/09
to
On Aug 7, 10:50 pm, Benjamin Kaplan <benjamin.kap...@case.edu> wrote:
> That isn't an operator at all. Python does not support compound
> comparisons like that. You have to do "a > b and b > c".

You know, it costs nothing to open up a python interpreter and check
your certainty:

>>> x = 10
>>> 1 < x < 20
True

This is a _very_ common pattern.

>>> class X(object):
... def __lt__(self, other):
... print 'in lt'
... return True
... def __gt__(self, other):
... print 'in gt'
... return True
...
>>> x = X()
>>> 1 < x < 20
in gt
in lt
True
>>> 20 < x < 1
in gt
in lt
True

dmitrey: Diez' advice was the best you received.

Diez B. Roggisch

unread,
Aug 7, 2009, 10:18:55 AM8/7/09
to
alex23 schrieb:

Not really. I didn't get the chaining, and Peter is right that for that
there is no real overloading.

Diez

alex23

unread,
Aug 7, 2009, 10:32:10 AM8/7/09
to
"Diez B. Roggisch" <de...@nospam.web.de> wrote:
> Not really. I didn't get the chaining, and Peter is right that for that
> there is no real overloading.

I'm sorry, I don't really get why overloading lt & gt isn't an answer
to the OP's question... His terminology may not have been correct but
I'm not sure why it's not a sufficient response.

(then again it is a Friday night and I have been out drinking...)

Robert Lehmann

unread,
Aug 7, 2009, 9:59:45 AM8/7/09
to pytho...@python.org
On Fri, 07 Aug 2009 08:50:52 -0400, Benjamin Kaplan wrote:

> On Fri, Aug 7, 2009 at 8:00 AM, dmitrey<dmitrey...@scipy.org>
> wrote:

> That isn't an operator at all. Python does not support compound
> comparisons like that. You have to do "a > b and b > c".

Python actually allows you to chain comparison operators, automatically
unpacking ``a > b > c`` to ``a > b and b > c``::

>>> class C(object):
... def __lt__(self, other):
... print self, "LESS-THAN", other
... return True
...
>>> a = C(); b = C(); x = C()
>>> a < x < b
<__main__.C object...> LESS-THAN <__main__.C object...>
<__main__.C object...> LESS-THAN <__main__.C object...>
True

>>> x = 42
>>> 40 < x < 50 # between 40 and 50
True
>>> 50 < x < 60 # between 50 and 60
False
>>> 1 == True < 2 == 2.0 < 3 < 4 != 5 > 0 # yikes, unreadable! but legal.
True
>>> # same as: (1 == True) and (True < 2) and (2 == 2.0) ...

HTH,

--
Robert "Stargaming" Lehmann

Scott David Daniels

unread,
Aug 7, 2009, 11:04:22 AM8/7/09
to
Benjamin Kaplan wrote:
> .... Python does not support compound

> comparisons like that. You have to do "a > b and b > c".

Funny, my python does. This has been around a long time.
I am not certain whether 1.5.2 did it, but "chained comparisons"
have been around for a long time.

>>> 'a'< 'd' <'z'
True
>>> 'a'< 'D' <'z'
False

--Scott David Daniels
Scott....@Acm.Org

exa...@twistedmatrix.com

unread,
Aug 7, 2009, 11:02:13 AM8/7/09
to pytho...@python.org
On 12:50 pm, benjami...@case.edu wrote:
>On Fri, Aug 7, 2009 at 8:00 AM, dmitrey<dmitrey...@scipy.org>
>wrote:
>That isn't an operator at all. Python does not support compound

>comparisons like that. You have to do "a > b and b > c".

That's partially correct. There is no "compound less than operator", or
whatever you want to call that. However, Python does support "compound
comparisons" like that:

>>> 1 < 2 < 3
True
>>> 1 < 3 < 2
False
>>> 1 == 2 == 3
False
>>> 2 == 2 == 2
True
>>>
Jean-Paul

Steven D'Aprano

unread,
Aug 7, 2009, 11:31:46 PM8/7/09
to
On Fri, 07 Aug 2009 08:04:22 -0700, Scott David Daniels wrote:

> Benjamin Kaplan wrote:
>> .... Python does not support compound comparisons like that. You have
>> to do "a > b and b > c".
>
> Funny, my python does. This has been around a long time. I am not
> certain whether 1.5.2 did it, but "chained comparisons" have been around
> for a long time.

Yes it does:

$ python1.5
Python 1.5.2 (#1, Apr 1 2009, 22:55:54) [GCC 4.1.2 20070925 (Red Hat
4.1.2-27)] on linux2
Copyright 1991-1995 Stichting Mathematisch Centrum, Amsterdam
>>>
>>> 2 < 3 < 4
1


Remembering that back then, 0 and 1 were used instead of False and True.


--
Steven

Carl Banks

unread,
Aug 8, 2009, 12:01:47 AM8/8/09
to

You can program __lt__, __gt__, and friends to return a closure with a
boolean value. See my upcoming reply to the author.


Carl Banks

Carl Banks

unread,
Aug 8, 2009, 12:10:35 AM8/8/09
to

Actually, scratch that. It won't work because the chained comparison
short-circuits. If you have __lt__ return a closure then a < b won't
work unless a < b is always true, which means it'll cause ordinary
binary comparison to fail. Oh well.


Carl Banks

0 new messages