解决 enum34 元类冲突?

3
有没有办法让自定义元类与enum34包(Python 3之前的版本)兼容?
import enum
import six

class MyMeta(type):
    def __new__(cls, class_name, bases, class_dict):
        print("Does something useful.")
        return super(MyMeta, cls).__new__(cls, class_name, bases, class_dict)

@six.add_metaclass(MyMeta)
class MyClass(object):
    def __init__(self, *args, **kwargs):
        pass

MyEnum = enum.Enum('MyEnum', [('One', 1), ('Two', 2), ('Three', 3)], type=MyClass)

以上的代码在enum34模块中会抛出一个错误,错误发生在enum_class = super(EnumMeta, metacls).__new__(metacls, cls, bases, classdict)这一行代码:

TypeError: metaclass conflict: the metaclass of a derived class must be a (non-strict) subclass of the metaclasses of all its bases

你想要实现什么?为什么需要使用Mixin? - warvariuc
实际上,我希望创建一个枚举,其值是从自定义类型派生的。不幸的是,所涉及的类型具有元类,这就是问题的起源。我想我只能把我的值放在字典或其他东西中了。 - kloffy
我在我的评论中告诉你如何修复这个问题。 - warvariuc
这看起来是一个有趣的问题。 ;) 你能给出你尝试使用的自定义值的缩减版本吗? - Ethan Furman
@EthanFurman 这些自定义值是具有特征的类的实例(类似于http://code.enthought.com/projects/traits/),因此需要元类。为了避免这样的问题,我已经改用简单的字典键/值映射而不是枚举。 - kloffy
显示剩余2条评论
2个回答

1
你应该从enum.Enum的元类中派生出MyMeta:
class MyMeta(type(enum.Enum)):
    ...

谢谢,但不幸的是那并不起作用。相反,你会得到以下错误:TypeError: new enumerations must be created as 'ClassName([mixin_type,] enum_type)' - kloffy
我猜这就是 Python 2 中 Enum34 的限制。根据文档,Enumtype 参数是“要混合到新 Enum 类中的类型”。如果你需要一个 mixin,就像消息建议的那样:class MyEnum(MyClass, enum.Enum): - warvariuc

1

你应该只写Enum而不是enum.Enum,这个问题会被解决。

例如:

        class MyEnumClass(Enum):
               ........

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接