<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">2018-03-24 17:14 GMT+03:00 Nick Coghlan <span dir="ltr"><<a href="mailto:ncoghlan@gmail.com" target="_blank">ncoghlan@gmail.com</a>></span>:<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="ltr"><div class="gmail_extra"><div class="gmail_quote"><div><br></div><div>They can be distinguished, just not at module or function scope. To give a concrete example:<br><br>==========<br>    >>> class C:<br>    ...     sequence = range(10)<br>    ...     listcomp = [x for x in sequence]<br>    ...     def works(data):<br>    ...         return list(data)<br>    ...     from_works = works(sequence)<br>    ...     def fails():<br>    ...         return list(sequence)<br>    ... <br>    >>> C.listcomp<br>    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]<br>    >>> C.from_works<br>    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]<br>    >>> C.fails()<br>    Traceback (most recent call last):<br>      File "<stdin>", line 1, in <module><br>      File "<stdin>", line 8, in fails<br>    NameError: name 'sequence' is not defined<br>==========<br><br></div></div>I think I did have an implementation that didn't do the "outermost iterator is evaluated in the outer scope" dance early on (back when I was still working on the initial version of the iteration variable hiding, before it was merged to the Py3k branch), but quickly changed it because relying solely on closures broke too much code (in addition to the class namespace case, you can create a situation with similar constraints by passing a separate locals namespace to exec).<br><br></div><span class="gmail-"><div class="gmail_extra">Cheers,<br></div><div class="gmail_extra">Nick.</div></span></div></blockquote></div><br></div><div class="gmail_extra">But is the example with the class appropriate in this context, it seems that it is well understood why this example will fail, and  `<span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:start;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">C.fails()</span>` should at least be a `@classmethod`:) From the docs:</div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><font face="arial, helvetica, sans-serif"><span style="color:rgb(34,34,34);font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:justify;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline">Class definition blocks and arguments to </span><a class="gmail-reference gmail-internal" href="https://docs.python.org/3/library/functions.html#exec" title="exec" style="color:rgb(99,99,187);text-decoration:none;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:justify;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)"><code class="gmail-xref gmail-py gmail-py-func gmail-docutils gmail-literal" style="background-color:transparent;padding:0px 1px;font-weight:normal;border-radius:3px"><span class="gmail-pre" style="hyphens: none;">exec()</span></code></a><span style="color:rgb(34,34,34);font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:justify;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"><span> </span>and<span> </span></span><a class="gmail-reference gmail-internal" href="https://docs.python.org/3/library/functions.html#eval" title="eval" style="color:rgb(99,99,187);text-decoration:none;font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:justify;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255)"><code class="gmail-xref gmail-py gmail-py-func gmail-docutils gmail-literal" style="background-color:transparent;padding:0px 1px;font-weight:normal;border-radius:3px"><span class="gmail-pre" style="hyphens: none;">eval()</span></code></a><span style="color:rgb(34,34,34);font-style:normal;font-variant-ligatures:normal;font-variant-caps:normal;font-weight:400;letter-spacing:normal;text-align:justify;text-indent:0px;text-transform:none;white-space:normal;word-spacing:0px;background-color:rgb(255,255,255);text-decoration-style:initial;text-decoration-color:initial;float:none;display:inline"> are special in the context of name resolution. A class definition is an executable statement that may use and define names. These references follow the normal rules for name resolution with an exception that unbound local variables are looked up in the global namespace. The namespace of the class definition becomes the attribute dictionary of the class. The scope of names defined in a class block is limited to the class block; it does not extend to the code blocks of methods – this includes comprehensions and generator expressions since they are implemented using a function scope.</span></font></blockquote><div>And if we cross out class, exec and eval cases - they don't work now, they will not be affected in future. Are not these examples equivalent?</div><div><br></div><div>With kind regards,</div><div>-gdg</div></div>