Skip to content

Element overrides python behavior of cmp #14065

@tscrim

Description

@tscrim

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

Metadata

Metadata

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions