New submission from bzip2 <adnan.de...@gmail.com>:

The sections on list, set and dict comprehensions in the tutorial on data 
structures (ref. 1) state repeatedly that they are equivalent to for loops, but 
do not mention that this is not true in classes. In fact, the example used for 
nested list comprehensions (section 5.1.4) will work in a function, but not in 
a class. Similarly, there seems to be no mention of this scope "limitation" in 
the tutorial on classes (ref. 2), despite a section on scopes and namespaces 
(section 9.2) and another that mentions list comprehensions (section 9.10). The 
scope "limitation" is mentioned at the end of a section on resolution of names 
on a page about the execution model in the reference guide (ref. 3), and of 
course in various forums, where people may perhaps eventually find them after 
wasting time trying to figure out what they've done wrong.

If comprehensions are "equivalent" to for loops only under certain conditions 
(in a class, but only in a class, only one variable from outside the 
comprehension is accessible in the comprehension, and it must be the outermost 
iterable), they are not equivalent and should not be described as such. This 
"limitation" should be mentioned prominently wherever comprehensions are 
described, since both classes and comprehensions are presumably common 
constructs. When people read "is equivalent to" without a qualifier, they 
assume "is always equivalent to".

Returning to section 9.10 in ref. 2, the unique_words example is misleading 
because it strongly implies that nested for loops in a comprehension should 
work in a class. Since that's only true in some cases, the example should be 
qualified. More broadly, because that tutorial is about classes, the relevance 
of the last three sections should be revisited.

As an aside, I agree with the developers who consider this scope "limitation" a 
bug and not (paraphrasing) "just how the language works", since the exact same 
two lines of code, which depend on no other variables or functions, work in a 
function or module but not in a class.

1. https://docs.python.org/3/tutorial/datastructures.html
2. https://docs.python.org/3/tutorial/classes.html
3. https://docs.python.org/3/reference/executionmodel.html

----------
assignee: docs@python
components: Documentation
messages: 332808
nosy: bzip2, docs@python
priority: normal
severity: normal
status: open
title: documentation of list, set & dict comprehension make no mention of buggy 
class scope behavior
type: behavior
versions: Python 2.7, Python 3.4, Python 3.5, Python 3.6, Python 3.7

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

Reply via email to