#11768: Get source code for parent/element classes of categories
---------------------------+------------------------------------------------
Reporter: SimonKing | Owner: jason
Type: enhancement | Status: new
Priority: major | Milestone: sage-5.0
Component: misc | Keywords: sources dynamic class
Work_issues: | Upstream: N/A
Reviewer: | Author:
Merged: | Dependencies:
---------------------------+------------------------------------------------
Currently (sage-4.7.2.alpha2) one can not interactively get the source
code of the parent or element classes of a category:
{{{
sage: C.parent_class??
Type: DynamicMetaclass
Base Class: <class 'sage.structure.dynamic_class.DynamicMetaclass'>
String Form: <class 'sage.categories.rings.Rings.parent_class'>
Namespace: Interactive
File: /mnt/local/king/SAGE/sage-4.7.2.alpha1/local/lib/python2.6
/site-packages/sage/categories/rings.py
Source:
class DynamicMetaclass(type):
"""
A metaclass implementing an appropriate reduce-by-construction method
"""
def __reduce__(self):
"""
See sage.structure.dynamic_class.dynamic_class? for non trivial
tests.
TESTS::
...
}}}
As one can see, it gets the source file right, but can not find the class
definition in it.
I tried to track it down.
* For a dynamic metaclass, we want to obtain the documentation and source
of the base class (resp. the class that is passed too the dynamic
metaclass by the `doccls` argument).
* The module is correctly provided, and thus Python's inspect module is
able to find the source file.
* If it is a class then Python's inspect module tries to find something
like `"class "+cls.__name__+":"` in the sources (they use a more
sophisticated regular expression).
* The base class is `Rings().ParentMethods`. Unfortunately, it is defined
by `class ParentMethods`, but the name is differently:
{{{
sage: Rings().ParentMethods.__name__
'Rings.ParentMethods'
}}}
I do not suggest to change the name: If the name is just `'ParentMethods'`
then Python's inspect module would always find the first occurence of that
name, which is bad if one module defines several categories.
Instead, I suggest to create a new function in `sage.misc.sageinspect`
that recursively finds the sources for classes whose sources can't be
found by other methods and whose name contains a dot:
The function that I plan to write does not start with the whole source
file of `sage.categories.rings`, but it starts with the sources of
`sage.categories.rings.Rings` and then searches `class ParentMethods`
(with the regular expression from the inspect module) only in that small
part of the full source file.
I think "getting sources" belongs to the component "misc", even though the
problem is relevant for not getting confused by the category framework.
Thus, cc to Nicolas...
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/11768>
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 post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/sage-trac?hl=en.