Ron_Adam wrote:
> 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.> > Examples:> > def a(x):> # ...> x = y # x is assigned to global y unintentionally.> # ...> return x> > def b(x):> # hide globals somehow> # ...> x = y # Cause a name error> # ...> return x> > > y = True> > >>>>a(False):> > True> > >>>>b(False):> > *** name error here ***> > > Ron_Adam> >
For testing, you could simply execute the function in an empty dict:
>>> a = "I'm a">>> def test():
... print a
...
>>> test()
I'm a
>>> exec test.func_code in {}
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 2, in test
NameError: global name 'a' is not defined
>>>
This would get more complicated when you wanted to test calling with parameters,
so with a little more effort, you can create a new function where the globals
binding is to an empty dict:
>>> from types import FunctionType as function>>> testtest = function(test.func_code, {})>>> testtest()
Traceback (most recent call last):
File "<input>", line 1, in ?
File "<input>", line 2, in test
NameError: global name 'a' is not defined
>>>
HTH
Michael