Skip to content

Add rich comparison special methods (__ne__, __gt__, etc.) to a class

License

Notifications You must be signed in to change notification settings

dgingrich/pycomparable

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

DISCLAIMER:

Although this works (it really adds the rich comparison operators), it's for
fun/learning purposes only.  If you really need all the comparisons, you're
probably better off writing __cmp__.  I think Python3000 might automatically
create __ne__ based on __eq__.  The one real world use might be to easily
add all rich comparison methods to a subclass where the parent class
implements a subset of the operator.  But how often does that happen?  Just
use it for fun.


Try to add rich comparison methods (__eq__, __ne__, etc.) to an existing class.
It exports three names:

* comparable - class decorator
* ComparableMetaclass - Metaclass to automatically call comparable
* ComparableMixin - Mixin to automatically call comparable

comparable works as a class decorator.  It takes a class as an argument and
returns a decorated class.  comparable attempts to add the rich comparison
special methods if they are not defined.  If __eq__ is not defined, it will
try to define it as being not != or not (< or >), etc.  It then sets != as
the inversion of ==.  Finally it sets whatever inequalities are possible
(e.g. < === <= and not ==).

comparable will not overwrite existing methods.

comparable won't add methods if there is not enough information.  For
example, if only __eq__ and __ne__ are defined, it will not attempt to add
any inequalities.  It also won't raise any errors, so be warned.

ComparableMetaclass and ComparableMixin are additional ways to create a
comparable class.  Both are simply wrappers for the main comparable
function.

Inspired by this discussion turned rant on comp.lang.python
(http://groups.google.com/group/comp.lang.python/browse_thread/thread/a5fa8ff0ffadd6ee/1aa3b5d25eae91d5)
Loosely based on Ruby's comparable module
(http://www.ruby-doc.org/core/classes/Comparable.html) though I believe the
implementation is different.

About

Add rich comparison special methods (__ne__, __gt__, etc.) to a class

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages