Turn of globals in a function?
Michael Spencer
mahs at telcopartners.com
Sat Mar 26 15:18:39 EST 2005
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
More information about the Python-list
mailing list