#14065: Element overrides python behavior of cmp
------------------------------------+---------------------------------------
Reporter: tscrim | Owner: sage-combinat
Type: defect | Status: needs_review
Priority: major | Milestone: sage-5.7
Component: combinatorics | Resolution:
Keywords: Element, cmp | Work issues:
Report Upstream: N/A | Reviewers:
Authors: Travis Scrimshaw | Merged in:
Dependencies: #14052 | Stopgaps:
------------------------------------+---------------------------------------
Old 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).
New 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.
--
Comment (by tscrim):
Added additional doctests about the MRO.
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/14065#comment:4>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica,
and MATLAB
--
You received this message because you are subscribed to the Google Groups
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac?hl=en.
For more options, visit https://groups.google.com/groups/opt_out.