Shri.Borde at microsoft.com
Wed Jun 21 21:00:08 CEST 2006
You should be able to declare a type that inherits from ModuleScope, and override ModuleScope.Get/SetGlobal. That should be the hook you need. Then you can use engine.Execute("a=1", myCustomModuleScope).
Do you want to help develop Dynamic languages on CLR? (http://members.microsoft.com/careers/search/details.aspx?JobID=6D4754DE-11F0-45DF-8B78-DC1B43134038)
From: users-bounces at lists.ironpython.com [mailto:users-bounces at lists.ironpython.com] On Behalf Of John Mancine
Sent: Tuesday, June 20, 2006 11:05 AM
To: 'Discussion of IronPython'
Subject: Re: [IronPython] OnVarChanged
Thanks for the info.
I think I have found what I was looking for now. Basically, this is the
earliest breakpoint that I hit after returning from the [Lightweight
Function] on the call stack after engine.Execute("a=1") is called.
IronPython.Runtime.ModuleScope.SetLocal(SymbolId symbol, object value)
Sure looks promising at least. The symbol is 'a' and the value is '1'.
I also found a IronPython.Runtime.Operations.Ups.MakeClass() call which
should be helpful for hooking into class declarations.
> -----Original Message-----
> From: users-bounces at lists.ironpython.com [mailto:users-
> bounces at lists.ironpython.com] On Behalf Of Michael Foord
> Sent: Tuesday, June 20, 2006 11:59 AM
> To: Discussion of IronPython
> Subject: Re: [IronPython] OnVarChanged
> John Mancine wrote:
> > I realize this is likely woefully naïve but I thought I'd ask anyhow.
> > I have a very specific case in my project where I would really like to
> > when a variable inside IronPython changes. Basically when I do this:
> > pythonEngine.Execute("a = 3"); // Or something more complex that ends up
> > changing global var 'a'
> > I am looking for a way to be notified when 'a' has been assigned to a
> > value. This seems to be pretty simple for the Set/GetGlobal() calls but
> > about code that is inside of the Execute() block? Where could I look at
> > adding some code myself such that I can add these hooks? I have dug
> > some of the code to find a place to add a hook but I couldn't seem to
> > anything clear cut.
> > Again, I realize this is pretty simplistic and also painfully slow for
> > moderate scripting but I have a very specific case where I would like
> > widgets in C# to respond to when a variable has changed. (The
> watchwindow in
> > visual studio would be a good parallel of what I'm needing to do -- ie.
> > a new value has been set for a particular value you are watching).
> Hello John,
> I may be off beam here (I'm no C# expert and know little about the
> IronPython internals) but it sounds like what you want to do is a bit at
> conflict with the way Python works.
> Python doesn't have variables by value as such, it has names and objects.
> In your example, 'a' isn't an object, it's a name bound to an object.
> When you do :
> a = 1
> a = 2
> it's not that the value of a changes, instead the name is rebound to a
> different object. Tracking changes to a mutable object is one thing, but
> tracking name binding is a different thing altogether.
> Perhaps you could replace the ``__dict__`` attribute of a module (where
> names are stored) with a custom 'dictionary-like' object, that calls a
> callback when assignments are made ? A better approach would be to use a
> value on an object (instead of a local variable), and you can get that
> object to perform a callback when changes are made.
> All the best,
> > Thanks!
> > John
> > _______________________________________________
> > users mailing list
> > users at lists.ironpython.com
> > http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
> users mailing list
> users at lists.ironpython.com
users mailing list
users at lists.ironpython.com
More information about the Ironpython-users