web-dev-qa-db-ja.com

Pythonの列挙型の一般的なプラクティスは何ですか?

可能性のある複製:
Pythonで「enum」を表すにはどうすればよいですか?

Pythonの列挙型の一般的なプラクティスは何ですか?つまりPythonでどのように複製されますか?

public enum Materials
{
    Shaded,
    Shiny,
    Transparent,
    Matte
}
136
Joan Venge
class Materials:
    Shaded, Shiny, Transparent, Matte = range(4)

>>> print Materials.Matte
3
363
Van Gale

私はこのパターンを何度か見ました:

>>> class Enumeration(object):
        def __init__(self, names):  # or *names, with no .split()
            for number, name in enumerate(names.split()):
                setattr(self, name, number)

>>> foo = Enumeration("bar baz quux")
>>> foo.quux
2

クラスメンバを使用することもできますが、独自の番号を付ける必要があります。

>>> class Foo(object):
        bar  = 0
        baz  = 1
        quux = 2

>>> Foo.quux
2

より堅牢なもの(スパース値、列挙固有の例外など)を探している場合は、 このレシピを試してください

19
Ben Blank

EnumがPythonでネイティブにサポートされない理由はわかりません。それらをエミュレートするために私が見つけた最良の方法は、_ str _と_ eq _をオーバーライドすることです。したがって、それらを比較し、print()を使用すると、数値の代わりに文字列を取得します。

class enumSeason():
    Spring = 0
    Summer = 1
    Fall = 2
    Winter = 3
    def __init__(self, Type):
        self.value = Type
    def __str__(self):
        if self.value == enumSeason.Spring:
            return 'Spring'
        if self.value == enumSeason.Summer:
            return 'Summer'
        if self.value == enumSeason.Fall:
            return 'Fall'
        if self.value == enumSeason.Winter:
            return 'Winter'
    def __eq__(self,y):
       return self.value==y.value

使用法:

>>> s = enumSeason(enumSeason.Spring)

>>> print(s)

Spring
9
Spell

おそらく継承構造を使用できますが、これで遊んでいるほど、汚い感じがしました。

class AnimalEnum:
  @classmethod
  def verify(cls, other):
    return issubclass(other.__class__, cls)


class Dog(AnimalEnum):
  pass

def do_something(thing_that_should_be_an_enum):
  if not AnimalEnum.verify(thing_that_should_be_an_enum):
    raise OhGodWhy
6
Trey Stout