Avaliação de atributos de classe e geradores

Como exatamente o Python avalia atributos de classe? Eu me deparei com uma peculiaridade interessante (no Python 2.5.2) que gostaria de explicar.

Eu tenho uma classe com alguns atributos que são definidos em termos de outros atributos definidos anteriormente. Quando tento usar um objeto gerador, o Python gera um erro, mas se eu usar uma compreensão simples da lista normal, não há problema.

Aqui está o exemplo reduzido. Note que a única diferença é queBrie usa uma expressão geradora, enquantoCheddar usa uma compreensão de lista.

# Using a generator expression as the argument to list() fails
>>> class Brie :
...     base = 2
...     powers = list(base**i for i in xrange(5))
... 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 3, in Brie
  File "<stdin>", line 3, in <genexpr>
NameError: global name 'base' is not defined

# Using a list comprehension works
>>> class Cheddar :
...     base = 2
...     powers = [base**i for i in xrange(5)]
... 
>>> Cheddar.powers
[1, 2, 4, 8, 16]

# Using a list comprehension as the argument to list() works
>>> class Edam :
...     base = 2
...     powers = list([base**i for i in xrange(5)])
...
>>> Edam.powers
[1, 2, 4, 8, 16]

(Meu caso real foi mais complicado, e eu estava criando um dict, mas esse é o exemplo mínimo que eu encontrei.)

Meu único palpite é que as compreensões da lista são computadas nessa linha, mas as expressões geradoras são calculadas após o final da classe, ponto no qual o escopo foi alterado. Mas não tenho certeza porque a expressão do gerador não atua como um fechamento e armazena a referência à base no escopo na linha.

Existe uma razão para isso e, em caso afirmativo, como devo estar pensando na mecânica de avaliação dos atributos de classe?

questionAnswers(2)

yourAnswerToTheQuestion