Why doesn't a dictionary work in classes?

Peter Otten __peter__ at web.de
Tue Dec 25 16:09:30 EST 2018

אורי wrote:

> Why does this not work:
> class User(ValidateUserPasswordMixin, PermissionsMixin, Entity,
> AbstractBaseUser):

>     GENDER_VALID_VALUES = [choice[0] for choice in GENDER_CHOICES]

>     ALL_GENDERS = [GENDERS_DICT[gender] for gender in GENDER_VALID_VALUES]
> (it throws an exception: `NameError: name 'GENDERS_DICT' is not defined`)

The list comprehension in Python 3 works like a generator generator 


In your case GENDER_VALID_VALUES is looked up in the class, and GENDERS_DICT 
is looked up in the function synthesized from the list comprehension.
As with methods this function only sees the local and the global namespace, 
but not the class namespace.

I realise that this is a long-winded way of saying "it is like it is",
but maybe it helps you understand what works and what doesn't.
This would work for example (not recommended for actual use):

        GENDERS_DICT[gender] for gender, GENDERS_DICT in
        zip(GENDER_VALID_VALUES, itertools.repeat(GENDERS_DICT))

> But this works:

> User.ALL_GENDERS = [User.GENDERS_DICT[gender] for gender in

User exists in the global namespace, and has both attributes, so no 
surprises here.

More information about the Python-list mailing list