【发布时间】:2013-08-26 06:58:17
【问题描述】:
我希望能够安排 Enum 的排序。有人建议如何解决这个问题?
以下枚举元类正在使用:
class EnumMeta(type):
def __new__(typ, name, bases, attrs):
cls_attrs = {}
cls_choices = []
for attr_name, value in attrs.items():
cls_attrs[attr_name] = attr_name.lower()
if not attr_name.startswith("__"):
cls_choices.append((attr_name.lower(), value))
def choices(cls):
return cls_choices
def values(cls, value=None):
if value is None:
return {choice[0]: unicode(choice[1]) for choice in cls.choices()}
elif isinstance(value, list):
return {choice[0]: unicode(choice[1]) for choice in cls.choices() if choice[0] in value}
else:
return unicode(dict(cls.choices()).get(value))
def keys(cls, nil=False):
items = [item[0] for item in cls.choices()]
if nil:
items.append('')
return items
def combined_length(cls):
return len(",".join(cls.values().keys()))
def max_length(cls):
return max(map(len, cls.values().keys()))
cls_attrs['choices'] = classmethod(choices)
cls_attrs['values'] = classmethod(values)
cls_attrs['keys'] = classmethod(keys)
cls_attrs['combined_length'] = classmethod(combined_length)
cls_attrs['max_length'] = classmethod(max_length)
return type(name, bases, cls_attrs)
一个枚举的例子如下:
class SideHemType:
__ordering__ = ['double', 'single']
__metaclass__ = EnumMeta
Single = "Single side hem for opaque fabrics"
Double = "Double side hem for transparent fabrics"
class TestEnumOrdering:
print SideHemType.keys()
print SideHemType.values()
通过打印 Enum SideHemType,首先打印 Double,然后打印 Single。但我想先单,然后双。
【问题讨论】:
-
我在您提供的代码中看不到任何打印内容。我的疯狂猜测是您正在打印
dict,它不对键的顺序提供任何保证。 -
我觉得缩进终于对了……
-
dict 是 class.__dict__,不,没有排序
-
在代码中添加了排序,但它并没有解决我的问题。通过打印键,它的打印首先是单一的,然后是双重的。但就像在示例中一样,它应该是先双后单。
-
什么?您的评论——“但在示例中,它应该先双后单”与您的帖子相反——“但我希望先单后双”。应该是哪个?