On 15/07/2021 22:11, William Stein wrote:
On Thu, Jul 15, 2021 at 11:05 AM William Stein <[email protected]> wrote:

On Thu, Jul 15, 2021 at 9:13 AM Nils Bruin <[email protected]> wrote:

Following up: while sage's "RationalNumber" is indeed a numbers.Rational according to "isinstance", it does not actually adhere 
to the stated API: "numerator" and "denominator" are supposed to be properties, but in sage they are methods. So even in places 
where we are trying to fit into "Number" we are already failing. Changing the way that "numerator" and "denominator" 
behave would break a *LOT* of sage code.

It's 100% my fault that numerator and denominator are function calls
instead of properties. Here's why I made that choice, both for
rational numbers and for a lot of other things.   The reason is that I
watched lots of grad students struggling to use Sage/Python around
2006 (e.g., at Arizona Winter School, in classes, etc.), and having
two different concepts -- methods *and* attributes -- with no easy way
to know which is which, just made things much more difficult for
people.    People would do things like:

sage: A = matrix(...)
sage: A.det
<built-in method det of
sage.matrix.matrix_integer_dense.Matrix_integer_dense object at
0x7f7fca0c2ca0>

and be like "WTF?", and I would explain "A.det is a function.  You
have to call it.", and they woud then do

sage: A.det()
number

and think "OK, sage makes sense."   If basically at random half of the
things listed in tab completion needed parens after them and half
didn't, that would confuse the hell out of my poor potential users.
And with Sage there is really no clear way to decide whether or not
something should be a property or a method, since it's really a
function of "how hard is it to compute?  are there different inputs to
computing it?" The answer to the second question is unknown when you
write the thing, e.g., an input could be the algorithm or whether
proof is True.      The thing that really convinced me was that
"A.det?" would give help on a number (not the det function) in IPython
back then at least -- well definitely "help(A.det)" would "not work"
at all in a helpful way.

Please keep in mind that I made this choice over 15 years ago when
Sage had only a few users, and it would today have no users if I
hadn't made many design choices based on "what will confuse new users
less in 2005"...

  -- William

For one more attempt by Jeroen Demeyer at solving this issue, please see
https://discuss.python.org/t/pep-3141-ratio-instead-of-numerator-denominator/2037
I find the history of this topic quiet interesting.

Using methods for all public API of Sage still seems to me as the better choice. The reasons given above for this (no need to guess if parentheses are required and the expectation that properties are very efficient) are still relevant today.

In addition, it is possible that in the future numerator/denominator might get new arguments (e.g. reduce, canonicalize, or normalize as in SR). One more reason is that the numerator/denominator methods are used for more complicated mathematical objects in Sage, where calling them with arguments is sensible. In the python-ideas discussion Vincent Delecroix mentions that also real and imag methods/properties have the same problem, like calling `1j.real` in Sage compared to Python.

Regards,
TB

--
You received this message because you are subscribed to the Google Groups 
"sage-devel" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sage-devel/be427c8e-13cb-8793-293f-4cb16403067a%40gmail.com.

Reply via email to