Commit dd8ec79c authored by Robert Bradshaw's avatar Robert Bradshaw

Align cpdef enums with PEP 435.

parent abd86f36
...@@ -2,40 +2,62 @@ ...@@ -2,40 +2,62 @@
cimport cython cimport cython
cdef extern from *:
int PY_VERSION_HEX
cdef object __Pyx_OrderedDict
if PY_VERSION_HEX >= 0x02070000:
from collections import OrderedDict as __Pyx_OrderedDict
else:
__Pyx_OrderedDict = dict
@cython.internal @cython.internal
cdef class __Pyx_EnumMeta(type): cdef class __Pyx_EnumMeta(type):
def __init__(cls, name, parents, dct): def __init__(cls, name, parents, dct):
type.__init__(cls, name, parents, dct) type.__init__(cls, name, parents, dct)
cls.__values__ = [] cls.__members__ = __Pyx_OrderedDict()
def __iter__(cls): def __iter__(cls):
return iter(getattr(cls, '__values__', ())) return iter(cls.__members__.values())
def __getitem__(cls, name):
return cls.__members__[name]
# @cython.internal # @cython.internal
cdef type __Pyx_EnumBase cdef type __Pyx_EnumBase
class __Pyx_EnumBase(int): class __Pyx_EnumBase(int):
__metaclass__ = __Pyx_EnumMeta __metaclass__ = __Pyx_EnumMeta
def __new__(cls, value, name=None): def __new__(cls, value, name=None):
for v in cls.__values__: for v in cls:
if v == value or v.name == value: if v == value:
return v return v
if name is None: if name is None:
raise ValueError("Unknown enum value: '%s'" % value) raise ValueError("Unknown enum value: '%s'" % value)
res = int.__new__(cls, value) res = int.__new__(cls, value)
res.name = name res.name = name
setattr(cls, name, res) setattr(cls, name, res)
cls.__values__.append(res) cls.__members__[name] = res
return res return res
def __repr__(self): def __repr__(self):
return self.name return "<%s.%s: %d>" % (self.__class__.__name__, self.name, self)
def __str__(self): def __str__(self):
return self.name return "%s.%s" % (self.__class__.__name__, self.name)
#################### EnumType #################### #################### EnumType ####################
#@requires: EnumBase #@requires: EnumBase
class {{name}}(__Pyx_EnumBase):
pass
cdef dict __Pyx_globals = globals() cdef dict __Pyx_globals = globals()
{{for item in items}} if PY_VERSION_HEX >= 0x03040000:
__Pyx_globals['{{item}}'] = {{name}}({{item}}, '{{item}}') from enum import IntEnum
{{endfor}} {{name}} = IntEnum('{{name}}', __Pyx_OrderedDict([
{{for item in items}}
('{{item}}', {{item}}),
{{endfor}}
]))
{{for item in items}}
__Pyx_globals['{{item}}'] = {{name}}.{{item}}
{{endfor}}
else:
class {{name}}(__Pyx_EnumBase):
pass
{{for item in items}}
__Pyx_globals['{{item}}'] = {{name}}({{item}}, '{{item}}')
{{endfor}}
...@@ -33,11 +33,13 @@ True ...@@ -33,11 +33,13 @@ True
Traceback (most recent call last): Traceback (most recent call last):
NameError: ...name 'RANK_3' is not defined NameError: ...name 'RANK_3' is not defined
>>> list(PyxEnum) >>> set(PyxEnum) == set([TWO, THREE, FIVE])
[TWO, THREE, FIVE] True
>>> str(PyxEnum.TWO)
'PyxEnum.TWO'
>>> PyxEnum.TWO + PyxEnum.THREE == PyxEnum.FIVE >>> PyxEnum.TWO + PyxEnum.THREE == PyxEnum.FIVE
True True
>>> PyxEnum(2) is PyxEnum("TWO") is PyxEnum.TWO >>> PyxEnum(2) is PyxEnum["TWO"] is PyxEnum.TWO
True True
""" """
...@@ -63,8 +65,14 @@ def test_as_variable_from_cython(): ...@@ -63,8 +65,14 @@ def test_as_variable_from_cython():
""" """
>>> test_as_variable_from_cython() >>> test_as_variable_from_cython()
""" """
assert list(PyxEnum) == [TWO, THREE, FIVE] import sys
assert list(PxdEnum) == [RANK_0, RANK_1, RANK_2] if sys.version_info >= (2, 7):
assert list(PyxEnum) == [TWO, THREE, FIVE], list(PyxEnum)
assert list(PxdEnum) == [RANK_0, RANK_1, RANK_2], list(PxdEnum)
else:
# No OrderedDict.
assert set(PyxEnum) == {TWO, THREE, FIVE}, list(PyxEnum)
assert set(PxdEnum) == {RANK_0, RANK_1, RANK_2}, list(PxdEnum)
cdef int verify_pure_c() nogil: cdef int verify_pure_c() nogil:
cdef int x = TWO cdef int x = TWO
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment