特定の事柄に対して値を持たせる場合に、定数って使いたいじゃないですか。
Pythonで定数を扱う場合って個人的にはEnum
(列挙型)を使うのがいいと思うんです。
そもそもPythonって定数なくない?
そうなんです。
どんな値でもやりようによっては上書きできてしまうので、厳密な意味での定数は存在しません。
でも公式ドキュメント にそう書いてあるんだもん。
列挙型の記法
from enum import Enum
class Hoge(Enum):
ONE = 1
TWO = 2
THREE = 3
列挙型とループ処理
列挙型は識別子の集合なので、識別子に持たせた値そのものに意味があるケースが少ないのではないかなと。
リスト型であればfor文で簡単に出力できるのですが、列挙型では書き方に工夫が要ります。
>>> lst = [1, 2, 3]
>>> [l for l in lst]
[1, 2, 3]
>>> from enum import Enum
>>> class Hoge(Enum):
... ONE = 1
... TWO = 2
... THREE = 3
...
>>> [v.value for n, v in Hoge.__members__.items()]
[1, 2, 3]
ここまで来れば書けそう
>>> from enum import Enum
>>> class Hoge(Enum):
... ONE = 1
... TWO = 2
... THREE = 3
...
>>> [v.value for n, v in Hoge.__members__.items()]
[1, 2, 3]
>>> 1 in [v.value for n, v in Hoge.__members__.items()]
True
できました。使い所は知りません。
おまけ
列挙型の__members__
の中身ってどうなっているんだろう?
>>> Hoge.__members__
mappingproxy({
'ONE': <Hoge.ONE: 1>,
'TWO': <Hoge.TWO: 2>,
'THREE': <Hoge.THREE: 3>
})
MappingProxyType
ってなんだろう?
公式ドキュメントによると
読み出し専用のマッピングのプロキシです。マッピングのエントリーに関する動的なビューを提供します。
つまり、マッピングが変わった場合にビューがこれらの変更を反映するということです。
なるほど(?)
このプロキシの中にitems()
があるわけですね。
さらっと見た感じだと辞書型にも似てますね。
追記
@shiracamus様よりもっと簡素的な書き方があると教えていただきました。
>>> 1 in [e.value for e in Hoge]
True
あるいは
>>> any(e.value == 1 for e in Hoge)
True
と書けるようです。ありがとうございます!!
一つ目の方はなぜ気付かなかったのだろうかというレベルです・・・
記事を書くことでアドバイスをいただけるので、やはりアウトプットって大切だなぁと思いました。