On Sun, Aug 1, 2010 at 5:40 PM, koffie <m.derickx.stud...@gmail.com> wrote:
> Hej All,
>
> I started developing for sage not so long ago and I wonder if there
> are some good coding practices / conventions for dealing with global
> functions and attributes which have the same name and also do the same
> thing. An example of such a global function / atribute combination:
>
> sage: sqrt(3)
> sqrt(3)
> sage: 3.sqrt()
> sqrt(3)
>
> I came up with this question because during the developing I ran into
> two examples showing the relevance of the question. (And the relevance
> is also backed by my experience in using sage as an enduser. Global
> functions sometimes doing something else as atributes, or the global
> funtion working just fine and not having the local function and all
> sort of related unexpected or non-intuitive behaviour)
>
> Example 1: the valuation function.
> def valuation(m, p):
>    if hasattr(m, 'valuation'):
>        return m.valuation(p)
>    if is_FractionFieldElement(m):
>        return valuation(m.numerator()) - valuation(m.denominator())
>    if m == 0:
>        import sage.rings.all
>        return sage.rings.all.infinity
>    r = 0
>    power = p
>    while not (m % power): # m % power == 0
>        r += 1
>        power *= p
>    return r
>
> The first point is that It has some implementation specific for
> FractionFieldElements in here of which I think this should not be
> there (especially since fraction fields have a valuation method).
> I already made a small trac ticket for this now needing review:
> http://trac.sagemath.org/sage_trac/ticket/9652
> And the second point is that there is code after:
>
> if hasattr(m, 'valuation'):
>        return m.valuation(p)
>
> I think the code after that should be put in the apropriate ring
> element class. The second example shows why.
>
>
> Example 2: A similar thing goes wrong with the is_square() method of
> which I recently broke a doctest during developement by adding a
> is_square() method to RingElement which raises a "NotImplementedError"
> in most cases since I expect others to overwrite it. Instead of the
> hasattr they do it by the "try: except AtributeError:" construction.
>
> In arith.py there are about 20 cases in which things like one of the
> examples above happen. And also in some cases similar things happen
> using isinstance.
> If things like that happen that often then there should be a reason
> for that right? Is this part of sage design and am I not getting a
> convention/coding style or is it for historic reasons?

It's mostly historical.  In fact, I think arith.py was the very first
file I created when I started writing Sage.

 -- William

>
> In both cases I would like to know some best practices for dealing
> with the problems involved in the "global functions versus atributes"
> story. And maybe  there should be a small part discussing this in the
> developerguide in the "Design" or "Conventions for Coding in Sage".
>
> Kind Regards
> Maarten Derickx
>
> --
> To post to this group, send an email to sage-devel@googlegroups.com
> To unsubscribe from this group, send an email to 
> sage-devel+unsubscr...@googlegroups.com
> For more options, visit this group at 
> http://groups.google.com/group/sage-devel
> URL: http://www.sagemath.org
>



-- 
William Stein
Professor of Mathematics
University of Washington
http://wstein.org

-- 
To post to this group, send an email to sage-devel@googlegroups.com
To unsubscribe from this group, send an email to 
sage-devel+unsubscr...@googlegroups.com
For more options, visit this group at http://groups.google.com/group/sage-devel
URL: http://www.sagemath.org

Reply via email to