On 12/25/18, אורי <u...@speedy.net> wrote: > > ALL_GENDERS = [GENDERS_DICT[gender] for gender in GENDER_VALID_VALUES] > > (it throws an exception: `NameError: name 'GENDERS_DICT' is not defined`)
Python 3 comprehensions have their own scope. This prevents the side effect of defining the comprehension's loop variable in the enclosing scope, which is a problem in Python 2. However, it also prevents the evaluated expression from directly accessing names defined in an unoptimized enclosing scope, except for the global scope, since such scopes cannot be the source scope of closure variables. This applies to comprehensions in class statements and exec(), where globals and locals are different dicts. Our 'parameter' for this comprehension scope is the expression for the outer loop iterable, which gets evaluated in the enclosing scope. Thus, for what it's worth, we can hack this to work as follows: ALL_GENDERS = [GD[gender] for GD, GVV in ((GENDERS_DICT, GENDER_VALID_VALUES),) for gender in GVV] -- https://mail.python.org/mailman/listinfo/python-list