#4489: weird introspection question, specifically with certain objects in cython
files
----------------------------+-----------------------------------------------
Reporter: craigcitro | Owner: was
Type: defect | Status: new
Priority: major | Milestone:
Component: user interface | Keywords:
----------------------------+-----------------------------------------------
There are two weird introspection issues that Jon Hanke pointed out, and I
took the time to track down. In particular, there are issues with
introspection on top-level `def` and `cpdef` methods in any `.pyx` file.
Here are two examples of what can go on:
{{{
sage: sage.rings.polynomial.polynomial_element.make_generic_polynomial??
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function make_generic_polynomial>
Namespace: Interactive
Source:
def make_generic_polynomial(parent, coeffs):
return parent(coeffs)
}}}
The problem here is that the source file that this function comes from
does not appear anywhere, even though it should.
However, things can get worse:
{{{
Type: builtin_function_or_method
Base Class: <type 'builtin_function_or_method'>
String Form: <built-in function is_Polynomial>
Namespace: Interactive
Source:
def is_Polynomial(f):
"""
Return True if f is of type univariate polynomial.
INPUT:
f -- an object
EXAMPLES:
sage: from sage.rings.polynomial.polynomial_element import
is_Polynomial
sage: R.<x> = ZZ[]
sage: is_Polynomial(x^3 + x + 1)
True
sage: S.<y> = R[]
sage: f = y^3 + x*y -3*x; f
y^3 + x*y - 3*x
sage: is_Polynomial(f)
True
However this function does not return True for genuine multivariate
polynomial type objects or symbolic polynomials, since those are not
of the same data type as univariate polynomials:
sage: R.<x,y> = QQ[]
sage: f = y^3 + x*y -3*x; f
y^3 + x*y - 3*x
sage: is_Polynomial(f)
False
sage: var('x,y')
(x, y)
sage: f = y^3 + x*y -3*x; f
y^3 + x*y - 3*x
sage: is_Polynomial(f)
False
"""
return PY_TYPE_CHECK(f, Polynomial)Class Docstring:
<attribute '__doc__' of 'builtin_function_or_method' objects>
}}}
I have several issues with this:
* the info in the top block is wrong
* no source file appears
* both the formatting and placement of the `Class Docstring` bit at the
end are weird.
Now, it's actually much worse than just that -- `is_Polynomial` is
(currently) imported into the global namespace, and the entry in the
global namespace is pretty messed up:
{{{
sage: is_Polynomial
<functools.partial object at 0x7ca3b40>
sage: is_Polynomial??
Error getting source: could not find class definition
Type: partial
Base Class: <type 'functools.partial'>
String Form: <functools.partial object at 0x7ca3b40>
Namespace: Interactive
File: /Users/craigcitro/three-
two/local/lib/python/functools.py
Docstring [source file open failed]:
partial(func, *args, **keywords) - new function with partial
application
of the given arguments and keywords.
}}}
It seems to think that `is_Polynomial` is a completely different type, in
fact a Python builtin!!
So I've only dug around a bit, but here's what I've found. First, this
looks bad:
{{{
sage: sage.rings.polynomial.polynomial_element.is_Polynomial
<built-in function is_Polynomial>
sage: sage.rings.polynomial.all.is_Polynomial
<built-in function is_Polynomial>
sage: sage.rings.all.is_Polynomial
<built-in function is_Polynomial>
sage: sage.all.is_Polynomial
<functools.partial object at 0x7ca3b40>
sage: sage.all.is_Polynomial == sage.rings.all.is_Polynomial
False
}}}
This '''could''' mean that in the process of doing imports after
`sage.rings.all`, some module imports `is_Polynomial` and breaks
something.
Interestingly, the docstring printed above is '''not''' the docstring that
the module has for `is_Polynomial`:
{{{
sage: sage.rings.all.__dict__['is_Polynomial'].__doc__
"File: sage/rings/polynomial/polynomial_element.pyx (starting at line
72)\n\n Return True if f is of type univariate polynomial.\n\n
INPUT:\n f -- an object\n\n EXAMPLES:\n sage: from
sage.rings.polynomial.polynomial_element import is_Polynomial\n
sage: R.<x> = ZZ[]\n sage: is_Polynomial(x^3 + x + 1)\n
True\n sage: S.<y> = R[]\n sage: f = y^3 + x*y -3*x; f\n
y^3 + x*y - 3*x\n sage: is_Polynomial(f)\n True\n\n
However this function does not return True for genuine multivariate\n
polynomial type objects or symbolic polynomials, since those are not\n
of the same data type as univariate polynomials:\n sage: R.<x,y> =
QQ[]\n sage: f = y^3 + x*y -3*x; f\n y^3 + x*y - 3*x\n
sage: is_Polynomial(f)\n False\n sage: var('x,y')\n
(x, y)\n sage: f = y^3 + x*y -3*x; f\n y^3 + x*y - 3*x\n
sage: is_Polynomial(f)\n False\n "
}}}
I'm starting to believe that this is two separate isssues: one for
imports, and one for the docstring getting mis-parsed during
introspection. I'm adding Rob Bradshaw to the first, because I think he'll
know right offhand if anything funny is going on with the way the
`polynomial_element` module gets initialized in the Cython code, and Nick
Alexander, because I'm sure he'll be able to quickly point me in the right
direction on the introspection stuff.
Please comment if you find anything -- I'll happily try and fix if someone
points me in the right direction.
--
Ticket URL: <http://trac.sagemath.org/sage_trac/ticket/4489>
Sage <http://sagemath.org/>
Sage - Open Source Mathematical Software: Building the Car Instead of
Reinventing the Wheel
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---