On 26 Mar 2005 22:51:14 -0800, [EMAIL PROTECTED] (Oren Tirosh) wrote: >Ron_Adam <[EMAIL PROTECTED]> wrote in message news:<[EMAIL PROTECTED]>... >> 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 -- http://mail.python.org/mailman/listinfo/python-list