id summary reporter owner description type status priority milestone component resolution keywords cc merged author reviewer upstream work_issues branch commit dependencies stopgaps
14065 Element overrides python behavior of cmp Travis Scrimshaw Sage Combinat CC user "As part of #12913, we are adding inheritance from `Element` to many classes that inherit from `CombinatorialObject`. However, there are many functions are relying on a valid call to `cmp`, but `Element` overrides this. This patch is a fix which implements a basic `__cmp__` for `CombinatorialObject` for the switch.
Another issue this ticket does is add a `__nonzero__()` to `CombinatorialObject` so things like `if p:` and `not p` will work when also inheriting from `Element` (which checks against the `Parent().zero_element()` and is not implemented for all parents).
Here's an example of how this breaks:
{{{
sage: from sage.structure.element import Element
sage: class Foo(CombinatorialObject, Element):
... def __init__(self, l):
... CombinatorialObject.__init__(self, l)
...
sage: L = [Foo([4-i]) for i in range(4)]
sage: sorted(L, cmp)
Traceback (most recent call last):
...
NotImplementedError: BUG: sort algorithm for elements of 'None' not implemented
sage: f = Foo([4])
sage: not f
Traceback (most recent call last):
...
AttributeError: 'NoneType' object has no attribute 'zero_element'
}}}
'''NOTE''' - After the patch, the `CombinatorialObject` needs to come ''before'' `Element` because of the MRO." defect closed major sage-5.8 combinatorics fixed Element, cmp, days45 Nicolas M. Thiéry Sage Combinat CC user sage-5.8.beta0 Travis Scrimshaw Mike Hansen N/A #14052