Turn of globals in a function?

Michael Spencer mahs at telcopartners.com
Sat Mar 26 21:18:39 CET 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