[issue24796] Deleting names referencing from enclosed and enclosing scopes

New submission from Nick Coghlan: While committing issue #24129, I noticed the following in the execution model documentation: ================== If a variable is referenced in an enclosing scope, it is illegal to delete the name. An error will be reported at compile time. ================== I'm not sure what that means, as both of the following compiled fine for me under 3.4.2:
def f(): ... x = 1 ... def g(): ... nonlocal x ... del x ... def f(): ... x = 1 ... del x ... def g(): ... print(x) ...
---------- assignee: docs@python components: Documentation messages: 248036 nosy: docs@python, ncoghlan priority: normal severity: normal status: open title: Deleting names referencing from enclosed and enclosing scopes _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Nick Coghlan added the comment: Note that I haven't attempted to resolve this myself, as I'm not sure if we should just delete the paragraph, or if we accidentally dropped a compile time error check that didn't have any tests somewhere along the line. Probably a good one to raise on python-dev... ---------- _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Steven D'Aprano added the comment: I wonder if it is a left-over from the behaviour prior to 3.2? In 3.1, I get this syntax error: py> def outer(): ... spam = 1 ... def inner(): ... nonlocal spam ... del spam ... inner() ... SyntaxError: can not delete variable 'spam' referenced in nested scope See also the "Changed in 3.2" comment here: https://docs.python.org/3/reference/simple_stmts.html#the-del-statement ---------- nosy: +steven.daprano _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Changes by Ivan Levkivskyi <levkivskyi@gmail.com>: ---------- nosy: +levkivskyi _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Ivan Levkivskyi added the comment: It looks like it is safe to just remove this line from docs. This code
x = 1 def f(): ... global x ... del x ... f() x
Works as expected, i.e. raises NameError. (The same happens for nonlocal but with UnboundLocalError.) ---------- _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Changes by Mariatta Wijaya <mariatta.wijaya@gmail.com>: ---------- keywords: +easy stage: -> needs patch versions: +Python 3.5, Python 3.6, Python 3.7 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Changes by Ivan Levkivskyi <levkivskyi@gmail.com>: ---------- pull_requests: +667 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Changes by Mariatta Wijaya <mariatta.wijaya@gmail.com>: ---------- pull_requests: +680 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Changes by Mariatta Wijaya <mariatta.wijaya@gmail.com>: ---------- pull_requests: +681 _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________

Mariatta Wijaya added the comment: Thanks for the PR, Ivan. Merged and backported to 3.5 and 3.6. ---------- nosy: +Mariatta resolution: -> fixed stage: needs patch -> resolved status: open -> closed _______________________________________ Python tracker <report@bugs.python.org> <http://bugs.python.org/issue24796> _______________________________________
participants (4)
-
Ivan Levkivskyi
-
Mariatta Wijaya
-
Nick Coghlan
-
Steven D'Aprano