the5fire

关注Python、Django、Vim、Linux、Web开发、团队管理和互联网--Life is short, we need Python.


关于PEP435的Enum和namedtuple及枚举实现

作者:the5fire | 标签:       | 发布:2013-05-26 5:53 p.m. | 阅读量: 8933, 8654

关于python在3.4中出现一个新的枚举的类 Enum ,刚出来时也看了下PEP-435的描述,没有太过于注意。今天群里大家简要的讨论了下枚举这个东西。wrongway兄也抛出了自己的看法,同时也让我(们)知道了有namedtuple这样一个东西的存在。然后我又仔细看了下PEP-435内容。

wrongway兄的观点是“namedtuple比所谓的枚举要更为灵活,其实我个人是不觉得有必要加入枚举。” 不过我的观点刚好相反,我觉得在python中实现一个功能有很多中方法,但是最佳的方法只有一个,应该清晰明确的表达码者的意图。我觉得用Emun来实现枚举比用namedtuple要更清楚些。

什么是枚举

在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见。-- from wikipedia

实现枚举的三种种方式

定义一个星期的枚举

1. namedtuple

.. code:: python

from collections import namedtuple
Weekday = namedtuple('Weekly', 'sun, mon, tue, wen, thu, fri, sat')._make(range(7))

2. 自定义类

.. code:: python

class Entity(object):
    items = {}

    def __init__(self, *args):
        for name, value in args:
            self.items[name] = value

    def __setattr__(self, name, value):
        print value

    def __getattr__(self, key):
        return self.items.get(key)

Weekday = Entity(
    ('sun', 0),
    ('mon', 1),
    ('tue', 2),
    ('web', 3),
    ('thu', 4),
    ('fri', 5),
    ('sat', 6),
)

print Weekday.sun

3. 使用Enum

这个只能是py3.4中才有的了

.. code:: python

from enum import Enum
class  Weekday(Enum):
    sun = 0
    mon = 1
    tue = 2
    web = 3
    thu = 4
    fri = 5
    sat = 6

经过上面的实现我觉得还是最后一个相对清晰。

你怎么看?

参考:

  • PEP435 <http://www.python.org/dev/peps/pep-0435/>_
  • collections.namedtuple <http://docs.python.org/2/library/collections.html#collections.namedtuple>_
- from the5fire.com
----EOF-----

微信公众号:Python程序员杂谈


其他分类: