| Store | Cart

Turn of globals in a function?

From: Ron_Adam <rad...@tampabay.rr.com>
Sun, 27 Mar 2005 16:45:19 GMT
On 26 Mar 2005 22:51:14 -0800, oren at REMOVETHIS1.hishome.net (Oren
Tirosh) wrote:

>Ron_Adam <radam2 at tampabay.rr.com> wrote in message news:<6qeb415iqqsor4biebk6rqj9g6jv3lpt55 at 4ax.com>...>> Is there a way to hide global names from a function or class?>> >> I want to be sure that a function doesn't use any global variables by>> mistake.  So hiding them would force a name error in the case that I>> omit an initialization step.  This might be a good way to quickly>> catch some hard to find, but easy to fix, errors in large code blocks.>>def noglobals(f):>.   import new>.   return new.function(>.       f.func_code, >.       {'__builtins__':__builtins__},>.       f.func_name, >.       f.func_defaults, >.       f.func_closure>.   )>>You can use it with the Python 2.4 @decorator syntax:>>@noglobals>def a(...):>.   # code here

Cool!  I haven't played with decorators yet. :)

I noticed the 'new' module is depreciated. It referred me to call the
object type directly instead.  So this is probably the better way.

def noglobals(f):
    return type(f)(
       f.func_code, 
       {'__builtins__':__builtins__},
       f.func_name, 
       f.func_defaults, 
       f.func_closure )

@noglobals
def a():
    global x
    try: x
    except: x=0
    x += 1
    return x

x = 5
for n in range(10):
    print a()
print x		# x is still 5


So this is another, but longer, way to do a generator. 


>>> print type(a).__doc__
function(code, globals[, name[, argdefs[, closure]]])

Create a function object from a code object and a dictionary.
The optional name string overrides the name from the code object.
The optional argdefs tuple specifies the default argument values.
The optional closure tuple supplies the bindings for free variables.
>>> 

What are 'free variables'?

And is there a way to directly read what names in a function are set
with the global statement? (Other than looking at the monitor. ;)

Ron_Adam


  

Recent Messages in this Thread
Ron_Adam Mar 26, 2005 08:01 pm
Michael Spencer Mar 26, 2005 08:18 pm
Bengt Richter Mar 26, 2005 09:02 pm
Ron_Adam Mar 27, 2005 02:49 am
Oren Tirosh Mar 27, 2005 06:51 am
Ron_Adam Mar 27, 2005 04:45 pm
Greg Ewing Mar 31, 2005 04:28 am
Ron_Adam Mar 31, 2005 05:31 pm
Ron_Adam Mar 27, 2005 02:13 am
Messages in this thread