複数のクラスレベルの変数を持つクラスを作成しようとしています。そのクラスのいくつかは、以前に宣言されたクラスレベルの変数を参照する計算値を持っています。しかし、私は特定の時点で変数を参照するのが難しいです。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を実行している)すべての
これは、リストの理解度に変更したときにエラーが消えてしまったため、ジェネレータ式の有効範囲に問題があるように見えます。 – TigerhawkT3
また、NUM_BUCKETSはジェネレータでうまくいきます.BUCKET_SIZEの部分だけに問題があります –
本質的に[この質問](http://stackoverflow.com/questions/20136955/python3-nested-list-comprehension-scope)のdupeその質問はPython 3にあり、リストの理解を使用しています。私はgenexpsを使って良い偽候補者を見ません。 – user2357112