Test for nested class Parent - Utilities

Skip to content
Back to top
View this page
Edit this page

# Test for nested class Parent

This file contains a discussion, examples, and tests about nested classes and parents. It is kept in a separate file to avoid import loops.

EXAMPLES:

Currently pickling fails for parents using nested classes (typically for categories), but deriving only from Parent:

Sage

    sage: from sage.misc.test_nested_class import TestParent1, TestParent2, TestParent3, TestParent4
    sage: P = TestParent1()
    sage: TestSuite(P).run()
    Failure ...
    The following tests failed: _test_elements, _test_pickling

Python

    >>> from sage.all import *
    >>> from sage.misc.test_nested_class import TestParent1, TestParent2, TestParent3, TestParent4
    >>> P = TestParent1()
    >>> TestSuite(P).run()
    Failure ...
    The following tests failed: _test_elements, _test_pickling

They actually need to be in the NestedClassMetaclass. However, due to a technical detail, this is currently not directly supported:

Sage

    sage: P = TestParent2()
    Traceback (most recent call last):
    ...
    TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
    sage: TestSuite(P).run()  # not tested

[Python]

    >>> from sage.all import *
    >>> P = TestParent2()
    Traceback (most recent call last):
    ...
    TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases
    >>> TestSuite(P).run()  # not tested

Instead, the easiest is to inherit from UniqueRepresentation, which is what you want to do anyway most of the time:

Sage

    sage: P = TestParent3()
    sage: TestSuite(P).run()

Python

    >>> from sage.all import *
    >>> P = TestParent3()
    >>> TestSuite(P).run()

This is what all Sage’s parents using categories currently do. An alternative is to use ClasscallMetaclass as metaclass:

Sage

    sage: P = TestParent4()
    sage: TestSuite(P).run()

[Python]

    >>> from sage.all import *
    >>> P = TestParent4()
    >>> TestSuite(P).run()