-
-
Notifications
You must be signed in to change notification settings - Fork 660
Description
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.
Depends on #14052
CC: @nthiery @sagetrac-sage-combinat
Component: combinatorics
Keywords: Element, cmp, days45
Author: Travis Scrimshaw
Reviewer: Mike Hansen
Merged: sage-5.8.beta0
Issue created by migration from https://trac.sagemath.org/ticket/14065