On Dec 27, 2009, at 8:47 AM, Nicolas M. Thiery wrote:

>       Hi Robert B and all,
>
> Does anyone know a trick to access the global variables for the "main"
> scope?
>
> In the attached patch (for 4.2; untested on 4.3), I am implementing
> the following in sage.misc.misc_c:
>
>    def inject_variable(name, value):
>        """
>            sage: from sage.misc.misc_c import inject_variable
>            sage: inject_variable("a", 314)
>            sage: a
>            314
>        """
>        G = globals()
>        G[name] = value
>
> When called from the interpreter, this works just fine. However, the
> purpose is to call this function from library code, and then it  
> breaks.
>
> More precisely, if I call this from a Python function, say
> `sage.misc.misc.inject_variable_test` as in the patch, then the
> globals() call returns instead the global variables for the module
> `sage.misc.misc`.
>
> Tips most welcome!

This is because inject_variable is a hack based on the fact that Pyrex/ 
Cython has a broken implementation of globals()--it should refer to  
the module its in, but instead it ends up getting to the last  
registered globals in the thread call stack. (I have intentionally not  
"fixed" this as I did for locals() because we rely on the broken  
behavior, and there are issues for setting a cdef "global").

What we should do is walk up the stack, perhaps looking for __name__  
== '__main__'

- Robert

-- 
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