如何同时使用enum和enum34?

12

我注意到Python中枚举的行为与其他语言不同。

当我第一次运行时,有些惊讶地发现输出结果是一个int类型:

>>>import enum
>>>class Color(enum.Enum):
       red = 1

>>>Color.red
1

我意识到我安装的是enum而不是enum34

$ sudo apt-get install python-enum34

现在,结果是不同的:

>>>Color.red
<Color.red: 1>

我的当前应用程序接受enum类型,其中我使用value.value获取enum的值。当然,如果安装了错误的enum,这将引发异常。

我该如何处理这个问题?


你是在谈论除了标准库中的 enum 模块之外的其他模块吗?标准库中的那个不应该给你看到你所看到的结果。 - user2357112
我不知道。我刚刚安装了一个新的 ipython 并尝试了这个例子。我得到了前面的输出。然后我安装了 enum34,我得到了后面的结果。 - nowox
一个全新的安装应该会给你一个 ImportError 或者你想要的结果,这取决于你使用的 Python 版本。你确定你记得从 enum.Enum 继承吗?你展示的代码片段显然不是从实际的解释器会话中复制粘贴的。 - user2357112
enum.__file__是什么?也许你的系统中有其他杂散的enum模块。 - Blckknght
2个回答

5
作为一个猜测,看起来您拥有在3.4 Enum诞生之前已经存在的enum包。 enum34之所以这样命名,是因为之前的包已经存在。 enumenum34都安装到同一位置,因此使它们共存并不容易 - 而且这将使您的代码难以分发,因为其中一个枚举将位于非标准位置。
一种可能性是使用虚拟环境 - 然后可以在venv中安装应用程序所需的任何枚举。

这样,venv和您可以限制软件包,而不必担心项目之间的尴尬冲突。 - wom
更多地谈论“Both enum and enum34 install to the same location.”虚拟环境可以安装两个pip。pip list会列出两者。在这两种情况下,都需要执行from enum import Enum。是什么决定了哪个枚举包被加载? - Jerry101
1
哦!import enum; print(enum.__file__)让我找到了site-packages/,其中包含enum-0.4.6.dist-infoenum34-1.1.6.dist-info,而在.../site-packages/enum中安装的那个有一个清晰的README表明这是enum34。 - Jerry101
1
@Jerry101:被加载的是最后安装的那个。 - Ethan Furman
1
谢谢,@EthanFurman。使用 pip install -r requirements.txt 命令,pip 将决定安装软件包的顺序。因此,如果 requirements.txt 文件中列出了两个软件包,那么每个人都会得到相同的结果吗? - Jerry101
1
@Jerry101:我不知道。但正确的答案是不要这样做;使用其中一个即可。 - Ethan Furman

0

参考@Jerry101在另一个答案中的评论,这是我得出的结果:

def is_using_enum34(self):
    try:
        import enum
        return enum.__file__.__str__().endswith("__init__.pyc")
    except:
        return False
    return False

我注意到以下内容:
enum34: enum.__file__ == __init__.pyc
enum: enum.__file__ == enum.pyc.

我并没有大量使用它,这可能不是最理想的,但它适合我正在研究的内容,也可能对其他人有所帮助。


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