On 10/21/2013 7:52 PM, Steven D'Aprano wrote:
On Mon, 21 Oct 2013 15:51:56 -0400, Terry Reedy wrote:

On 10/21/2013 11:06 AM, Chris Angelico wrote:
Try typing this into IDLE:

def a():
      def b():
          nonlocal q
SyntaxError: no binding for nonlocal 'q' found

If you submit those three lines to Python from the command line, that is
what you see.

Arguably, that's also too strict,

As I quoted from the doc, it is an error for a program to contain a nonlocal with no referent. The reason is one only needs nonlocal to bind and unlike with 'global newname', it would be undefined where to do the binding.

def a():
  def b():
    def c():
      nonlocal q; q = 1

Where does q go? Replace nonlocal with global and there is no issue.

> but these *four* lines work fine interactively:

py> def a():
...     def b():
...             nonlocal q
...     q = 1

Chris had something like this.

and also from the command line:


[steve@ando ~]$ python3.3 -c "def a():
     def b():
         nonlocal q
     q = 1
"

What system lets you do that? (See other thread about Windows not allowing that, because newline terminates the command even after ".) Is '>' a line continuation marker (like '...' in Python)?

so it should also work in IDLE.

I agree, and implied such on the tracker issue
http://bugs.python.org/issue19335

The question is "what does Idle do differently from the C level interpreter". The answer is that is subclasses the Python-coded code.InteractiveInterpreter. Call this II. II.runsource compiles *cumulative* source ultimately with the Python-coded codeop._maybe_compile, which returns a code object (source complete and valid) or None (source incomplete) or raises (source complete but not valid). The bug is seeing the three line input as 'complete but invalid' rather than as 'incomplete' (as the regular interpreter must).

To verify that this is not an Idle bug:
C:\Programs\Python33>python -m code
Python 3.3.2 (v3.3.2:d047928ae3f6, May 16 2013, 00:06:53) [MSC v.1600 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> def a():
...  def b():
...   nonlocal c
  File "<string>", line None
SyntaxError: no binding for nonlocal 'c' found

There is a bit more on the tracker.

--
Terry Jan Reedy

--
https://mail.python.org/mailman/listinfo/python-list

Reply via email to