<html><head></head><body>Maybe it's just me, but nesting_<a href="http://demo.py">demo.py</a> has several junk characters at the end (^@).<br><br><div class="gmail_quote">On June 10, 2015 10:06:26 AM CDT, Chris Angelico <rosuav@gmail.com> wrote:<blockquote class="gmail_quote" style="margin: 0pt 0pt 0pt 0.8ex; border-left: 1px solid rgb(204, 204, 204); padding-left: 1ex;">
<pre class="k9mail">On Wed, Jun 10, 2015 at 4:17 PM, Chris Angelico <rosuav@gmail.com> wrote:<br /><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #729fcf; padding-left: 1ex;"><blockquote class="gmail_quote" style="margin: 0pt 0pt 1ex 0.8ex; border-left: 1px solid #ad7fa8; padding-left: 1ex;"> But I think your quick&dirty hack may be worth playing with even if it bans this possibility and a few others, and may not be that hard to do if you make that decision, so if I were you I'd try that first.</blockquote><br /><br /> Okay. I'll start poking around with CPython and see what I can do.<br /></blockquote><br />Here's a gross, disgusting, brutal hack. It applies only to try/except<br />(but can easily be expanded to other places; it's just a matter of<br />calling one function at top and bottom), and it currently assumes that<br />you're in a function scope (not at top level, not directly in a class;<br />methods are supported).<br
/><br />(Should I create a tracker issue? It's not even at proof-of-concept at<br />this point.)<br /><br />Here's how it works: As an 'except' block is entered (at compilation<br />stage), a new subscope is defined. At the end of the except block,<br />after the "e = None; del e" opcodes get added in, the subscope is<br />popped off and disposed of. So long as there is a subscope attached to<br />the current compilation unit, any name lookups will be redirected<br />through it. Finally, when co_varnames is populated, names get<br />de-mangled, thus (possibly) making duplicates in the tuple, but more<br />importantly, getting tracebacks and such looking correct.<br /><br />The subscope is a tiny thing that just says "this name now becomes<br />that mangled name", where the mangled name is the original name dot<br />something (eg mangle "e" and get back "e.0x12345678"); they're stored<br />in a linked list in the current compiler_unit.<br /><br />Currently, locals() basically ignores
the magic. If there is no<br />"regular" name to be shadowed, then it correctly picks up the interior<br />one; if there are both forms, I've no idea how it picks which one to<br />put into the dictionary, but it certainly can't logically retain both.<br />The fact that it manages to not crash and burn is, in my opinion, pure<br />luck :)<br /><br />Can compiler_nameop() depend on all names being interned? I have a<br />full-on PyObject_RichCompareBool() to check for name equality; if<br />they're all interned, I could simply do a pointer comparison instead.<br /><br />Next plan: Change compiler_comprehension_generator() to use subscopes<br />rather than a full nested function, and then do performance testing.<br />Currently, this can only have slowed things down. Removing the<br />function call overhead from list comps could give that speed back.<br /><br />ChrisA<br /></pre><p style="margin-top: 2.5em; margin-bottom: 1em; border-bottom: 1px solid #000"></p><pre class="k9mail"><hr
/><br />Python-ideas mailing list<br />Python-ideas@python.org<br /><a href="https://mail.python.org/mailman/listinfo/python-ideas">https://mail.python.org/mailman/listinfo/python-ideas</a><br />Code of Conduct: <a href="http://python.org/psf/codeofconduct/">http://python.org/psf/codeofconduct/</a></pre></blockquote></div><br>
-- <br>
Sent from my Android device with K-9 Mail. Please excuse my brevity.</body></html>