Terry J. Reedy added the comment:

The bug is not in Idle. Its interpreter is a subclass of 
code.InteractiveInterpreter (II) and that (and its subclass InteractiveConsole) 
have the 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

II.runsource compiles cumulative source with codeop.CommandCompile, which wraps 
codeop._maybe_compile. That returns None (source incomplete), raises (source 
complete but invalid), or return code (source complete and valid) to be 
executed. It mis-classifies the code in question.

>>> import codeop as op
>>> src = '''def a():
  def b():
     nonlocal c
'''
>>> op.CommandCompiler()(src)
Traceback (most recent call last):
...
SyntaxError: no binding for nonlocal 'c' found

PyShell.ModifiedInterpreter.runsource wraps II.runsource.
       return InteractiveInterpreter.runsource(self, source, filename)

Someone needs to compare _maybe_compile to the equivalent C code used by the 
real interpreter.

----------
components: +Library (Lib) -IDLE
title: IDLE over-enthusiastically verifies 'nonlocal' usage -> codeop 
misclassifies incomple code with 'nonlocal'

_______________________________________
Python tracker <rep...@bugs.python.org>
<http://bugs.python.org/issue19335>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to