classification
Title: Deleting names referencing from enclosed and enclosing scopes
Type: Stage: resolved
Components: Documentation Versions: Python 3.7, Python 3.6, Python 3.5
process
Status: closed Resolution: fixed
Dependencies: Superseder:
Assigned To: docs@python Nosy List: Mariatta, docs@python, levkivskyi, ncoghlan, steven.daprano
Priority: normal Keywords: easy

Created on 2015-08-05 13:05 by ncoghlan, last changed 2017-03-23 04:08 by Mariatta. This issue is now closed.

Pull Requests
URL Status Linked Edit
PR 754 merged levkivskyi, 2017-03-21 20:41
PR 774 merged Mariatta, 2017-03-23 04:06
PR 775 merged Mariatta, 2017-03-23 04:07
Messages (5)
msg248036 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2015-08-05 13:05
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)
...
msg248040 - (view) Author: Nick Coghlan (ncoghlan) * (Python committer) Date: 2015-08-05 13:53
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...
msg248042 - (view) Author: Steven D'Aprano (steven.daprano) * (Python committer) Date: 2015-08-05 14:48
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
msg289811 - (view) Author: Ivan Levkivskyi (levkivskyi) * Date: 2017-03-18 13:39
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.)
msg290022 - (view) Author: Mariatta Wijaya (Mariatta) * (Python committer) Date: 2017-03-23 04:08
Thanks for the PR, Ivan. Merged and backported to 3.5 and 3.6.
History
Date User Action Args
2017-03-23 04:08:31Mariattasetstatus: open -> closed

nosy: + Mariatta
messages: + msg290022

resolution: fixed
stage: needs patch -> resolved
2017-03-23 04:07:12Mariattasetpull_requests: + pull_request681
2017-03-23 04:06:31Mariattasetpull_requests: + pull_request680
2017-03-21 20:41:58levkivskyisetpull_requests: + pull_request667
2017-03-20 14:44:46Mariattasetkeywords: + easy
stage: needs patch
versions: + Python 3.5, Python 3.6, Python 3.7
2017-03-18 13:39:06levkivskyisetmessages: + msg289811
2015-08-05 15:08:10levkivskyisetnosy: + levkivskyi
2015-08-05 14:48:55steven.dapranosetnosy: + steven.daprano
messages: + msg248042
2015-08-05 14:47:18ncoghlansetmessages: + msg248040
2015-08-05 13:05:17ncoghlancreate