Я пытаюсь создать класс с несколькими переменными уровня класса, некоторые из которых имеют рассчитанные значения, которые ссылаются на ранее объявленные переменные уровня класса. Однако у меня возникают трудности с ссылкой на переменные в определенных точках.Неравномерность присвоения переменной класса Python
Моя первая попытка:
#!/usr/bin/env python
from decimal import Decimal
import math
class Foo(object):
NUM_BUCKETS = 10
BUCKET_SIZE = Decimal(1.0/NUM_BUCKETS)
BUCKET_LABELS = tuple("BUCKET_{}".format(int(BUCKET_SIZE * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
print Foo.BUCKET_LABELS
Результат:
> python test.py
Traceback (most recent call last):
File "test.py", line 5, in <module>
class Foo(object):
File "test.py", line 8, in Foo
BUCKET_LABELS = tuple("BUCKET_{}".format(int(BUCKET_SIZE * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
File "test.py", line 8, in <genexpr>
BUCKET_LABELS = tuple("BUCKET_{}".format(int(BUCKET_SIZE * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
NameError: global name 'BUCKET_SIZE' is not defined
Попытка получить доступ к переменной класса через имя класса не работает либо:
#!/usr/bin/env python
from decimal import Decimal
import math
class Foo(object):
NUM_BUCKETS = 10
BUCKET_SIZE = Decimal(1.0/NUM_BUCKETS)
BUCKET_LABELS = tuple("BUCKET_{}".format(int(Foo.BUCKET_SIZE * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
print Foo.BUCKET_LABELS
Результат:
> python test2.py
Traceback (most recent call last):
File "test2.py", line 5, in <module>
class Foo(object):
File "test2.py", line 8, in Foo
BUCKET_LABELS = tuple("BUCKET_{}".format(int(Foo.BUCKET_SIZE * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
File "test2.py", line 8, in <genexpr>
BUCKET_LABELS = tuple("BUCKET_{}".format(int(Foo.BUCKET_SIZE * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
NameError: global name 'Foo' is not defined
Замена ссылки на BUCKET_SIZE с жестким кодом устраняет проблему; несмотря на то, что есть еще одна ссылка на переменную уровня класса в одной и той же линии, она работает просто отлично:
#!/usr/bin/env python
from decimal import Decimal
import math
class Foo(object):
NUM_BUCKETS = 10
BUCKET_SIZE = Decimal(1.0/NUM_BUCKETS)
BUCKET_LABELS = tuple("BUCKET_{}".format(int(Decimal(0.1) * i * 100)) for i in xrange(1, NUM_BUCKETS + 1))
print Foo.BUCKET_LABELS
Результат:
> python test3.py
('BUCKET_10', 'BUCKET_20', 'BUCKET_30', 'BUCKET_40', 'BUCKET_50', 'BUCKET_60', 'BUCKET_70', 'BUCKET_80', 'BUCKET_90', 'BUCKET_100')
Кто-нибудь знает правильный способ ссылки BUCKET_SIZE в этом месте? Это ошибка в самом Python? (Я бегу на Python 2.7.5, BTW.)
Это похоже на проблему с областью выражения генератора, потому что ошибка исчезла, когда я изменил ее на понимание списка. – TigerhawkT3
Также NUM_BUCKETS работает хорошо в генераторе, выпуская только часть с BUCKET_SIZE –
По существу, обман [этого вопроса] (http://stackoverflow.com/questions/20136955/python3-nested-list-comprehension-scope), кроме этот вопрос находится на Python 3 и использует понимание списка. Я не вижу никаких хороших кандидатов-кандидатов, использующих genexps. – user2357112