Mike wrote: > I'll apologize first for this somewhat lengthy example. It does > however recreate the problem I've run into. This is stripped-down code > from a much more meaningful system. > > I have two example classes, "AutoChecker" and "Snapshot" that evaluate > variables in their caller's namespace using the frame stack. As > written, the output is not what is expected: the variables evaluate to > "stagnant" values. > > However, if the one indicated line is uncommented, then the result is > as expected. > > So my questions are: Is this a bug in Python? Is this an invalid use > of frame data? Why does the single line "sys._getframe(1).f_locals" > fix the behavior?
A simplified demonstration of your problem: >>> def f(update): ... a = locals() ... x = 42 ... if update: locals() ... print a ... >>> f(False) {'update': False} >>> f(True) {'a': {...}, 'x': 42, 'update': True} The local namespace is not a dictionary, and the locals()/f_locals dictionary contains a snapshot of the local namespace. Accessing the f_locals attribute is one way to trigger an update of that snapshot. What's puzzling is that the same dictionary is reused. Peter -- http://mail.python.org/mailman/listinfo/python-list