<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On 13 May 2018 at 20:00, Tim Peters <span dir="ltr"><<a href="mailto:tim.peters@gmail.com" target="_blank">tim.peters@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">[Tim]<br>
<span class="">>> - If the target is not local to any function enclosing F, and is not<br>
>> declared `global` in the block containing F, then the target is bound<br>
>> in the block containing F.<br>
<br>
</span>[also Tim]<br>
> FYI, that's still not right, ...<br>
<span class="">> I suspect that the above should be reworded to the simpler:<br>
><br>
> - If the target is not  declared `global` or `nonlocal` in the block<br>
>   containing F, then the target is bound in the block containing F.<br>
</span>> ...<br>
<br>
I'm satisfied that captures the intent - but now it's misleadingly<br>
wordy.  It should be the briefer:<br>
<br>
- The target is bound in the block containing F.<br>
<br>
Other text (in section 4.2.2) already covers the intended meanings for<br>
when a `global` or `nonlocal` declaration appears in the block too.<br>
<br>
And then it's short enough again that the bullet list isn't really<br>
helpful anymore.  So, putting that all together:<br>
<span class=""><br>
"""<br>
An assignment expression binds the target, except in a function F<br>
synthesized to implement a list comprehension or generator expression<br>
</span>(see XXX).  In the latter case[1], the target is bound in the block<br>
containing F, and errors may be detected:  If the target also appears<br>
<span class="">as an identifier target of a `for` loop header in F, a `SyntaxError`<br>
</span>exception is raised.  If the block containing F is a class block, a<br>
`SyntaxError` exception is raised.<br>
<span class=""><br>
Footnote:<br>
[1] The intent is that runtime binding of the target occurs as if the<br>
binding were performed in the block containing F.  Because that<br>
necessarily makes the target not local in F, it's an error if the<br>
target also appears in a `for` loop header, which is a local binding<br>
for the same target.  If the containing block is a class block, F has<br>
no access to that block's scope, so it doesn't make sense to consider<br>
</span>the containing block.  The target is bound in the containing block,<br>
where it inherits that block's `global` or `nonlocal` declaration if<br>
one exists, else establishes that the target is local to that block.<br>
"""<br></blockquote><div><br></div><div>This is getting pretty close to being precise enough to be at least potentially implementable (thanks!), but there are still two cases that would need to be covered:<br><br></div><div>- what happens inside a lambda expression?<br></div><div>- what happens inside another comprehension or generator expression?<br><br></div><div>Cheers,<br></div><div>Nick.<br clear="all"></div></div><br>-- <br><div class="gmail_signature" data-smartmail="gmail_signature">Nick Coghlan   |   <a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>   |   Brisbane, Australia</div>
</div></div>