Generator expressions and parentheses

why are parentheses, in particular parentheses, required for generator expressions that contain tuples?

Why

((x, y)
 for x in range(10)
 for y in range(20))

      

instead

(x, y
 for x in range(10)
 for y in range(20))

SyntaxError: invalid syntax

      

+3


source to share


1 answer


The latter is a bit ambiguous: it starts out as a regular tuple, but then ends up in the generator later in the parsing. Perhaps this becomes more obvious if we have more than two elements, as in (1, 2, 3, 4, x for x in range(10))

.

This can also be seen in the grammar specification :

generator_expression ::=  "(" expression comp_for ")"

      

Where expression

later comes down to atom

(among others)



atom      ::=  identifier | literal | enclosure
enclosure ::=  parenth_form | list_display
               | generator_expression | dict_display | set_display
               | string_conversion | yield_atom
parenth_form ::=  "(" [expression_list] ")"
expression_list ::=  expression ( "," expression )* [","]

      

Ie, an expression_list

like x, y

must be enclosed in parentheses (except for purpose, for example a = b, c

, where it can be used directly).

assignment_stmt ::=  (target_list "=")+ (expression_list | yield_expression)

      

(Not only for generators, but also for comprehension of lists, but also in Python 3.)

+4


source







All Articles