Warren Stringer wrote: > Here is what I would like to do: > > #------------------------------------------------------------ > a = Tr3() # implements domain specific language > a.b = 1 # this works, Tr3 overrides __getattr__ > a.__dict__['b'] = 2 # just so you know that b is local > a[b] = 3 # I want to resolve locally, but get: > > Traceback (most recent call last): ... > exec cmd in globals, locals ... > NameError: global name 'b' is not defined > #------------------------------------------------------------
Note that your a[b]=3 is the same as '__ = b;a[__]=3' You get that exception because b is not a bound name in the namespace you are currently using. In order to get what you want, you will either need to use a['b'] = 3, a.b = 3, or a method that I refuse to describe to you. > This is intended for production code. The reason I refuse to describe to you the method that could 'solve' your particular problem is because it would be very difficult to differentiate between what you *want* to happen, and actual errors, which would make production code *very* difficult to get right. As an alternative to a['b'], you could use a[Z.b], for an object Z: class Z: def __getattr__(self, a): return a Z = Z() Which will have much less potential for destroying the maintainability and testability of your production code than hooking any trace function. - Josiah -- http://mail.python.org/mailman/listinfo/python-list