[IronPython] try...finally in yield
Adam Brand
adamb at silverkeytech.com
Mon Mar 30 21:40:47 PDT 2009
You can check out the files in question here:
<http://github.com/devhawk/devhawk_ipy/tree>
http://github.com/devhawk/devhawk_ipy/tree. ... those files are patched now
to use the below.which uses "with" to ensure the Dispose(). So the file is
closed after the lines in the file are read.
Adam
Adam Brand
SilverKey Technologies
From: users-bounces at lists.ironpython.com
[mailto:users-bounces at lists.ironpython.com] On Behalf Of Curt Hagenlocher
Sent: Sunday, March 29, 2009 6:27 PM
To: Discussion of IronPython
Subject: Re: [IronPython] try...finally in yield
Maybe I don't understand the problem you're having. Can you describe it
with a little more detail? When exactly do you want the file to be closed?
2009/3/29 Adam Brand <adamb at silverkeytech.com>
We are using 2.0 beta I think as part of ipy for asp.net. I don't think
close() is implemented in that version. Am I wrong?
Harry (who made it) suggested this:
def _process(xr):
while xr.Read():
xr.MoveToContent()
node = XmlNode(xr)
yield node
if xr.IsEmptyElement:
node = XmlNode(xr, endElement=True)
yield node
def load(xml):
"""generates an iterator over the XmlNodes in the stream of XML
represented by the xml argument"""
if isinstance(xml, XmlReader):
for n in _process(xml): yield n
else:
with XmlReader.Create(xml) as xr:
for n in _process(xr): yield n
Adam Brand
SilverKey Technologies
From: users-bounces at lists.ironpython.com
[mailto:users-bounces at lists.ironpython.com] On Behalf Of Curt Hagenlocher
Sent: Saturday, March 28, 2009 7:39 PM
To: Discussion of IronPython
Subject: Re: [IronPython] try...finally in yield
So I assume you're calling close() on the generator? A try/finally around
the code in the generator can be used to catch the StopIteration exception
and force the dispose. But even better, you could say "from __future__
import with_statement" at the top of your file and then say something like
this:
def parse(xml):
with XmlReader.Create(xml) as xr
while xr.Read():
[...]
We automatically do the right thing when using "with" and IDisposable, so
"with" effectively becomes like a C# "using" block.
2009/3/28 Adam Brand <adamb at silverkeytech.com>
I'm using IronPython for ASP.Net...have some code (not mine,
http://devhawk.net/2008/05/07/Deserializing+XML+With+IronPython.aspx - Harry
Pierson's) that converts an xml file into an object. It has the below
function:
def parse(xml):
xr = XmlReader.Create(xml)
while xr.Read():
xr.MoveToContent()
node = XmlNode(xr)
yield node
if (xr.IsEmptyElement):
node.nodeType = XmlNodeType.EndElement
del node.attributes
yield node
This code is problematic as it locks the xml file it is reading. I tried a
try...finally to do a .Close() and .Dispose(), but the compiler was not
happy with that. Just putting .Close() and .Dispose() at the end doesn't
work.
In reading up, I found this:
http://docs.python.org/whatsnew/2.5.html#pep-342
"The addition of the close() method has one side effect that isn't obvious.
close() is called when a generator is garbage-collected, so this means the
generator's code gets one last chance to run before the generator is
destroyed. This last chance means that try...finally statements in
generators can now be guaranteed to work; the finally clause will now always
get a chance to run. The syntactic restriction that you couldn't mix yield
statements with a try...finally suite has therefore been removed. "
I'm guessing that this isn't implemented in the version of IronPython in IP
for ASP.Net.
Does anyone have any ideas on a workaround for the generator for this
version?
Thanks,
Adam
--
Adam Brand
_______________________________________________
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
http://lists.ironpython.com/listinfo.cgi/users-ironpython.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.ironpython.com/pipermail/users-ironpython.com/attachments/20090330/2cee2945/attachment.htm>
More information about the Users
mailing list