0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

列挙型に値が存在するか確認する方法

Last updated at Posted at 2020-07-14

特定の事柄に対して値を持たせる場合に、定数って使いたいじゃないですか。
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

と書けるようです。ありがとうございます!!
一つ目の方はなぜ気付かなかったのだろうかというレベルです・・・

記事を書くことでアドバイスをいただけるので、やはりアウトプットって大切だなぁと思いました。

0
0
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?