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