Boilerplate in rich comparison methods

George Sakkis george.sakkis at gmail.com
Sat Jan 13 02:51:04 EST 2007


Steven D'Aprano wrote:

> I'm writing a class that implements rich comparisons, and I find myself
> writing a lot of very similar code. If the calculation is short and
> simple, I do something like this:
>
>
> class Parrot:
>     def __eq__(self, other):
>         return self.plumage() == other.plumage()
>     def __ne__(self, other):
>         return self.plumage() != other.plumage()
>     def __lt__(self, other):
>         return self.plumage() < other.plumage()
>     def __gt__(self, other):
>         return self.plumage() > other.plumage()
>     def __le__(self, other):
>         return self.plumage() <= other.plumage()
>     def __ge__(self, other):
>         return self.plumage() >= other.plumage()
>
> If the comparison requires a lot of work, I'll do something like this:
>
> class Aardvark:
>     def __le__(self, other):
>         return lots_of_work(self, other)
>     def __gt__(self, other):
>         return not self <= other
>     # etc.
>
> But I can't help feeling that there is a better way. What do others do?

Once upon a time I had written a metaclass to generate the boilerate,
filling in the gaps. It doesn't impose any constraints on which
comparisons you must implement, e.g you may implement __le__ and
__eq__, or __gt__ and __ne__, etc. Season to taste.

http://rafb.net/p/mpvsIQ37.nln.html

George




More information about the Python-list mailing list