Message 99880 - Python tracker (original) (raw)

On Mon, Feb 22, 2010 at 6:10 PM, Guido van Rossum <report@bugs.python.org> wrote:

Guido van Rossum <guido@python.org> added the comment:

All examples so far (*) have to do with our inability to have properly nested blocks. If we did, I'd make the except clause a block, and I'd issue a syntax warning or error if a nested block shadowed a variable referenced outside it. Ditto for generator expressions and comprehensions.

There's no reason we couldn't revise the language spec to explain that except clauses and comprehensions are block statements, i.e. statements that introduce a new block. For the except case, there would be some weird effects.

y = 10 try: ... except SomeError as err: y = 12 print y # prints 10

In the example above, y would be a local variable in the scope of the except handler that shadows the local variable in the block that contains the try/except. It might be confusing that you couldn't assign to a local variable in the except handler without using a nonlocal statement.

As long as we don't have nested blocks, I think it's okay to see the limitation on (implicit or explicit) "del" of a cell variable as a compiler deficiency and fix that deficiency.

The general request here is to remove all the SyntaxErrors about deleting cell variables, right? Instead, you'd get a NameError at runtime saying that the variable is currently undefined. You'd want that change regardless of whether we change the language as described above.

hoping-for-some-bdfl-pronouncements-ly y'rs, Jeremy


(*) However there's also this example:

def f(): ...  try: 1/0 ...  except Exception as a: ...   def g(): return a ...   return g ... SyntaxError: can not delete variable 'a' referenced in nested scope



Python tracker <report@bugs.python.org> <http://bugs.python.org/issue4617>