Incomplete ordering¶
ID: py/incomplete-ordering
Kind: problem
Security severity:
Severity: warning
Precision: very-high
Tags:
- reliability
- correctness
Query suites:
- python-security-and-quality.qls
Click to see the query in the CodeQL repository
A class that implements an ordering operator (__lt__
, __gt__
, __le__
or __ge__
) should implement all four in order that ordering between two objects is consistent and obeys the usual mathematical rules. If the ordering is inconsistent with default equality, then __eq__
and __ne__
should also be implemented.
Recommendation¶
Ensure that all four ordering comparisons are implemented as well as __eq__
and __ne__
if required.
It is not necessary to manually implement all four comparisons, the functools.total_ordering
class decorator can be used.
Example¶
In this example only the __lt__
operator has been implemented which could lead to inconsistent behavior. __gt__
, __le__
, __ge__
, and in this case, __eq__
and __ne__
should be implemented.
class IncompleteOrdering(object):
def __init__(self, i):
self.i = i
def __lt__(self, other):
return self.i < other.i
References¶
Python Language Reference: Rich comparisons in Python.