• 【转载】Python: Enum枚举的实现


    转自:http://www.cnblogs.com/codingmylife/archive/2013/05/31/3110656.html

     

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

    如果是新版Python用户(Python 3.4 with PEP 435):

    1
    2
    from enum import Enum
    Animal = Enum('Animal', 'ant bee cat dog')

    or

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

    旧版Python用户可以充分发挥动态语言的优越性来构造枚举,有简单的:

    1
    2
    3
    4
    5
    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'

    有复杂的:

    1
    2
    3
    4
    5
    6
    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

    有带值到名称映射的:

    1
    2
    3
    4
    5
    6
    7
    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'

    有用set实现的:

    1
    2
    3
    4
    5
    6
    7
    8
    class Enum(set):
        def __getattr__(self, name):
            if name in self:
                return name
            raise AttributeError
     
    Animals = Enum(["DOG", "CAT", "HORSE"])
    print Animals.DOG

    有用range实现的:

    1
    2
    3
    4
    5
    6
    7
    dog, cat, rabbit = range(3)
     
    # or
     
    class Stationary:
        (Pen, Pencil, Eraser) = range(0, 3)
    print Stationary.Pen

    有用tuple实现的:

    1
    2
    3
    4
    class Enum(tuple): __getattr__ = tuple.index
     
    State = Enum(['Unclaimed', 'Claimed'])
    print State.Claimed

    有用namedtuple实现的:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    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())
  • 相关阅读:
    LCA --算法竞赛专题解析(29)
    倍增与ST算法 --算法竞赛专题解析(28)
    可持久化线段树(主席树) --算法竞赛专题解析(27)
    莫队算法 --算法竞赛专题解析(26)
    分块 --算法竞赛专题解析(25)
    表格标题或内容平铺样式
    SpringMVC传参
    按字节截取字符串
    Redis常用命令及知识
    修改数据库字段类型或名字
  • 原文地址:https://www.cnblogs.com/tlz888/p/6993849.html
Copyright © 2020-2023  润新知