6d7b26d4e0
python install and lib/spack/external have the same library installed. This requires modifying the names of some modules in lib/spack/external in cases where both the system python and backported features of future python versions (i.e. after 2.6) are used (previously distinguished by "from external import X" and "import X").
30 lines
1.5 KiB
Python
30 lines
1.5 KiB
Python
#
|
|
# Backport of Python 2.7's total_ordering.
|
|
#
|
|
|
|
def total_ordering(cls):
|
|
"""Class decorator that fills in missing ordering methods"""
|
|
convert = {
|
|
'__lt__': [('__gt__', lambda self, other: not (self < other or self == other)),
|
|
('__le__', lambda self, other: self < other or self == other),
|
|
('__ge__', lambda self, other: not self < other)],
|
|
'__le__': [('__ge__', lambda self, other: not self <= other or self == other),
|
|
('__lt__', lambda self, other: self <= other and not self == other),
|
|
('__gt__', lambda self, other: not self <= other)],
|
|
'__gt__': [('__lt__', lambda self, other: not (self > other or self == other)),
|
|
('__ge__', lambda self, other: self > other or self == other),
|
|
('__le__', lambda self, other: not self > other)],
|
|
'__ge__': [('__le__', lambda self, other: (not self >= other) or self == other),
|
|
('__gt__', lambda self, other: self >= other and not self == other),
|
|
('__lt__', lambda self, other: not self >= other)]
|
|
}
|
|
roots = set(dir(cls)) & set(convert)
|
|
if not roots:
|
|
raise ValueError('must define at least one ordering operation: < > <= >=')
|
|
root = max(roots) # prefer __lt__ to __le__ to __gt__ to __ge__
|
|
for opname, opfunc in convert[root]:
|
|
if opname not in roots:
|
|
opfunc.__name__ = opname
|
|
opfunc.__doc__ = getattr(int, opname).__doc__
|
|
setattr(cls, opname, opfunc)
|
|
return cls
|