Intercepting binding?
Carl Banks
pavlovevidence at gmail.com
Thu Sep 24 07:12:24 EDT 2009
On Sep 23, 5:49 pm, "Rhodri James" <rho... at wildebst.demon.co.uk>
wrote:
> On Thu, 24 Sep 2009 01:34:35 +0100, andrew cooke <and... at acooke.org> wrote:
>
> > For example, I assume it's possible to somehow access the dictionary
> > for the current block, but I can't see how to do this after
> > assignment. If I do it in the Foo constructor, for example, "a" will
> > not yet be bound.
>
> I apologise for failing to notice earlier that you know what you're
> talking about. I blame the hour :-)
>
> I'm not sure you can access the namespace dictionary of the "current
> block" (module?), that's the problem. Oh, except via locals(), which
> might do exactly what you're after depending. Excuse me, I'm being
> very dim tonight.
Hmmm.
@contextlib.contextmanager
def capture_changed_bindings():
before = sys._getframe(2).f_locals.copy()
changed = {}
yield changed
after = sys._getframe(2).f_locals
for key,value in after.iteritems():
if value is changed:
continue
if key not in before or value is not before[key]:
changed[key] = value
def test():
a = 2
b = 3
c = 4
with capture_changed_bindings() as changed:
b = 5
c = 4
d = 6
print changed
test()
Quick and dirty, not robust at all. But you get the idea.
Carl Banks
More information about the Python-list
mailing list