On Sat, 26 Mar 2005 12:18:39 -0800, Michael Spencer <[EMAIL PROTECTED]> 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 -- http://mail.python.org/mailman/listinfo/python-list