Turn of globals in a function?

Ron_Adam radam2 at tampabay.rr.com
Sun Mar 27 04:13:20 CEST 2005


On Sat, 26 Mar 2005 12:18:39 -0800, Michael Spencer
<mahs at telcopartners.com> wrote:

>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
>  >>>

I didn't know you could do that. Interesting. :) 

I was hoping for something in line that could use with an assert
statement.  But this is good too, I'll have to play around with it a
bit. Thanks.

Ron


>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