python 3.4中枚举的自定义枚举类或python2.7中枚举34的自定义枚举类

enum34-custom的Python项目详细描述


traviscoverallsLatest VersionDownloadsSupported Python versionsMIT License

什么

python 3.4枚举模块的自定义枚举类。

安装

$ pip install enum34-custom

用法

多值枚举

枚举子类,其中成员可以是任何iterable(甚至是生成器,str除外)。 可以通过关联的iterable中的任何成员元素引用该成员。 它可以用于等价类划分(ecp/ec测试)。

fromenum_customimportMultiValueEnumclassSuit(MultiValueEnum):CLUBS='♣','c','C'DIAMONDS='♦','d','D'HEARTS='♥','h','H'SPADES='♠','s','S'>>>print(Suit.CLUBS)Suit.CLUBS>>>Suit.CLUBS<Suit.CLUBS:('♣','c','C')>>>>Suit('c')<Suit.CLUBS:('♣','c','C')>>>>Suit('c')isSuit('C')isSuit('♣')isSuit.CLUBSTrue>>>importpickle>>>pickle.loads(pickle.dumps(Suit('c')))isSuit('♣')True>>>Suit('L')Traceback(mostrecentcalllast):File"<stdin>",line1,in<module>File"/Users/walkman/Projects/enum34-custom/enum_custom.py",line19,in__call__returnsuper().__call__(suit)File"/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/enum.py",line222,in__call__returncls.__new__(cls,value)File"/usr/local/Cellar/python3/3.4.1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/enum.py",line457,in__new__raiseValueError("%s is not a valid %s"%(value,cls.__name__))ValueError:LisnotavalidSuit>>>list(Suit)[<Suit.CLUBS:('♣','c','C')>,<Suit.DIAMONDS:('♦','d','D')>,<Suit.HEARTS:('♥','h','H')>,<Suit.SPADES:('♠','s','S')>]

警告

在使用多值枚举时,需要记住以下几点:

  • 生成器将在类创建时立即耗尽

  • 为了符合标准的库行为,重叠的iterable是 考虑别名,工作方式与stdlib相同 (查找将匹配第一个声明的元素):

    >>>classMyOverLappingMVE(MultiValueEnum):...A=(0,1,2,3,4)...B=(4,5,6,7,8)>>>MyOverLappingMVE(4)<MyOverLappingMVE.A:(0,1,2,3,4)>

    如果要确保成员之间不存在重叠元素, 您可以使用无重叠装饰符:

    >>>fromenum_customimportMultiValueEnum,no_overlap>>>@no_overlap...classNoOverLappingEnum(MultiValueEnum):...A=(1,2,3)...B=(3,4,5).../Users/walkman/Projects/enum34-custom/enum_custom.pyinno_overlap(multienum)55(alias,name,intersection)induplicates])56raiseValueError('common element found in {!r}: {}'--->57.format(multienum,alias_details))58returnmultienum59ValueError:commonelementfoundin<enum'NoOverLappingEnum'>:B&A->{3}
  • 小心存储大量数据,每个值都会存储两次 (多值枚举将值内部存储在一个集合中,以便更快地查找)

  • 如果将dict声明为值,则将查找键(如预期)

CaseInsensitiveMultiValueEnum

这与MultiValueEnum的工作方式相同,除非成员的值包含 一个str,这些将在一个不区分大小写的成员中进行比较

考虑以下示例:

classSimpleMultiValueEnum(MultiValueEnum):one=1,'one'two=2,'two'>>>SimpleMultiValueEnum('One')/usr/local/Cellar/python3/3.4.1_1/Frameworks/Python.framework/Versions/3.4/lib/python3.4/enum.pyin__new__(cls,value)455ifmember.value==value:456returnmember-->457raiseValueError("%s is not a valid %s"%(value,cls.__name__))458459def__repr__(self):ValueError:OneisnotavalidSimpleMultiValueEnum

时间:

classCaseInsensitiveMVE(CaseInsensitiveMultiValueEnum):one=1,'one'two=2,'two'>>>CaseInsensitiveMVE('One')<CaseInsensitiveMVE.one:(1,'one')>

强度

此枚举的成员也是str的实例,可直接与字符串进行比较。 在声明时强制使用str类型。工作方式与python中描述的相同 枚举文档,检查类型除外。

警告

不可能使用OrderableMixin,因为成员 强度也是str的实例,排序成员将基于 str排序(例如'1'<;'2'、'a'<;'b'等) 如果要通过声明进行排序,则不使用类型化方法使用OrdabeLimIxIn 子类。

caseinsensitivestrenum

与强度相同,但成员以大写形式存储,并与它们进行比较 也不区分大小写:

fromenum_customimportCaseInsensitiveStrEnumclassMyCaseInsensitiveStrEnum(CaseInsensitiveStrEnum):one='a'two='b'>>>MyCaseInsensitiveStrEnum('a')=='A'True>>>MyCaseInsensitiveStrEnum.one=='a'True

测试

$ python setup.py test

或者以开发模式安装包并使用py.test进行测试:

$ pip install -e .
$ py.test

python 2和3之间的差异

python 2和3创建类的方式有一些不同,有 在2上效果不太好的事情,您应该注意:

  • X范围(5)!=X范围(5) 这在python 3中是相反的,因为range(5)=range(5),但是您可以使用 在本例中,range(5)=python 2中的range(5)。

  • python 2没有成员的定义顺序。这意味着您必须手动定义 _ order\uu属性能够按定义顺序比较成员(例如 OrdababixIn)。详见enum34 package dokumentation

  • str与unicode:这个库在python2中也不混合和匹配str类型 它在python2中使用unicode,在python3中使用str,并在 Strengum、CaseInsensitiveStrenum和CKeck仅用于文本类型 CaseInsensitiveMultiValueEnum。(所以如果你在python2中通过str,就不是这样了。) 麻木不仁!)

  • Python 2从列表理解中泄漏变量,因此如果定义类 像这样:

  • 在pypy上,您总是必须设置顺序,因为如果您使用不同的类型,因为 它将对成员值进行排序,但无法将set与其他类型进行比较。

    classMyList(MultiValueEnum):A=[nforninrange(5)]

    我的名单上也会有“我的名单”。!!


热门话题
java需要设置框架。可设置大小(false)以重新绘制()   java我对PDF文件感到困惑   为什么是太阳。jvm。热点。调试器。DebuggerException:无法打开二进制文件`?   设置结果为textview时出现java空指针异常   我应该使用什么同步原语在Java中实现事件驱动程序框架?   java为什么WindowClosing处理程序在退出程序之前不执行后台任务?   如何将“20170712T18:43:04.000Z”转换为安卓或java中的相对时间?   Java,获取按键的时间长度,currentTimeMillies()始终为24   maven构建的java可执行Jar找不到logback。xml   java在其外部的函数中使用for循环中的值   java如何以表格格式将不同长度的数据对齐   java Play 2.5 WebSocket连接构建   maven而非eclipse的java强制转换问题   java如何在JFreeChart中使X轴上的值水平?   构建Java Windows应用程序以访问在线MySQL数据库需要什么   java添加构造函数会出错吗?这没有道理,请帮忙,编程问题   java在一个jframe中的两个JPanel中使用两个绘制方法   java数学或逻辑问题   java如何复制Androids库存摄像头方向更改