## Python: Enum枚举的实现

2014-04-17

从C系语言过来用Python，好不容易适应了写代码不打花括号，突然有一天发现它居然木有枚举……于是stackoverflow了一把，发现神人的枚举（enum）实现到处都是，于是汉化总结过来。

 12 `from` `enum ``import` `Enum``Animal ``=` `Enum(``'Animal'``, ``'ant bee cat dog'``)`

or

 12345 `class` `Animals(Enum):``    ``ant ``=` `1``    ``bee ``=` `2``    ``cat ``=` `3``    ``dog ``=` `4`

 12345 `def` `enum(``*``*``enums):``    ``return` `type``(``'Enum'``, (), enums)``Numbers ``=` `enum(ONE``=``1``, TWO``=``2``, THREE``=``'three'``)``# Numbers.ONE == 1, Numbers.TWO == 2 and Numbers.THREE == 'three'`

 123456 `def` `enum(``*``sequential, ``*``*``named):``    ``enums ``=` `dict``(``zip``(sequential, ``range``(``len``(sequential))), ``*``*``named)``    ``return` `type``(``'Enum'``, (), enums)``Numbers ``=` `enum(``'ZERO'``, ``'ONE'``, ``'TWO'``)``# Numbers.ZERO == 0 and Numbers.ONE == 1`

 1234567 `def` `enum(``*``sequential, ``*``*``named):``    ``enums ``=` `dict``(``zip``(sequential, ``range``(``len``(sequential))), ``*``*``named)``    ``reverse ``=` `dict``((value, key) ``for` `key, value ``in` `enums.iteritems())``    ``enums[``'reverse_mapping'``] ``=` `reverse``    ``return` `type``(``'Enum'``, (), enums)``# Numbers.reverse_mapping['three'] == 'THREE'`

 12345678 `class` `Enum(``set``):``    ``def` `__getattr__(``self``, name):``        ``if` `name ``in` `self``:``            ``return` `name``        ``raise` `AttributeError``Animals ``=` `Enum([``"DOG"``, ``"CAT"``, ``"HORSE"``])``print` `Animals.DOG`

 1234567 `dog, cat, rabbit ``=` `range``(``3``)``# or``class` `Stationary:``    ``(Pen, Pencil, Eraser) ``=` `range``(``0``, ``3``)``print` `Stationary.Pen`

 1234 `class` `Enum(``tuple``): __getattr__ ``=` `tuple``.index``State ``=` `Enum([``'Unclaimed'``, ``'Claimed'``])``print` `State.Claimed`

 1234567891011121314 `from` `collections ``import` `namedtuple``def` `enum(``*``keys):``    ``return` `namedtuple(``'Enum'``, keys)(``*``keys)``MyEnum ``=` `enum(``'FOO'``, ``'BAR'``, ``'BAZ'``)``# 带字符数字映射的，像C/C++``def` `enum(``*``keys):``    ``return` `namedtuple(``'Enum'``, keys)(``*``range``(``len``(keys)))``# 带字典映射的，可以映射出各种类型，不局限于数字``def` `enum(``*``*``kwargs):``    ``return` `namedtuple(``'Enum'``, kwargs.keys())(``*``kwargs.values())`

0条评论