LoginSignup
8
2

More than 1 year has passed since last update.

【Python】ひっそりとPython 3.11で追加された`enum.StrEnum`について解説【小ネタ】

Last updated at Posted at 2022-12-13

PythonのenumモジュールにはこれまでにもintEnumのミックスインで、.valueを使わなくてもオブジェクト自体がint(のサブクラス)として扱えるIntEnumがありました。

Python3.11からそれらに加えて、strEnumのミックスインであるStrEnumが実装されました。

IntEnumと同じく、.valueを使わなくてもオブジェクトそれ自体がstrのサブクラスなのでstrとの比較が可能です。

Python 3.11.0 (main, Oct 24 2022, 18:26:48) [MSC v.1933 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> from enum import auto, StrEnum
>>> class Hoge(StrEnum):
...     FOO = "FOO"
...     BAR = "BAR"
... 
>>> Hoge.FOO
<Hoge.FOO: 'FOO'>
>>> Hoge.BAR
<Hoge.BAR: 'BAR'>
>>> Hoge.FOO == "FOO" 
True

また、識別子を自動的につけてくれるauto関数もサポートされています。
値はアトリビュート名を小文字にしたものになります。

>>> class Fuga(StrEnum): 
...     FOO = auto()
...     BAR = auto()
... 
>>> Fuga.FOO
<Fuga.FOO: 'foo'>
>>> Fuga.BAR             
<Fuga.BAR: 'bar'>

小文字にしてしまうのは「余計なお世話」感もあります。

しかし識別子を管理するものとして使うのがenumの役割で、値に意味を持たせない使い方=ユニークでありさえすればなんでも構わないということなのでしょう。

  • Enumのサブクラスなのにautoを使えなくしてしまうとリスコフの置換原則に違反するため、仕様を決めないといけないということもありそうです。
  • その値自体が文字列として意味があるのであればtyping.Literalを使う方がいいということなのでしょう。

ご興味のある方は使ってみては?

8
2
0

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
8
2