【问题标题】:How to live with both enum and enum34?如何同时使用 enum 和 enum34?
【发布时间】:2016-05-02 20:14:13
【问题描述】:

我注意到 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 模块吗?标准库中的那个不应该给你你看到的结果。
  • 我不知道。我刚刚运行了ipython 的全新安装并尝试了这个示例。我得到了前一个输出。然后我安装了enum34,得到了后者的结果。
  • 全新安装应该会给您一个 ImportError 或您想要的结果,具体取决于您的 Python 版本。你确定你记得从enum.Enum 继承吗?您清楚显示的代码 sn-ps 不是从实际的解释器会话中复制粘贴的。
  • enum.__file__ 是什么?也许您的系统上的某个地方还有其他一些杂散的enum 模块。

标签: python enums


【解决方案1】:

作为猜测,您似乎拥有在 3.4 枚举出现之前就存在的 enum 包。 enum34 之所以如此命名,是因为之前的包已经存在。

enumenum34 都安装到同一个位置,因此使它们共存并不容易——而且它会使您的代码难以分发,因为其中一个枚举位于非标准位置.

一种可能性是使用virtual envs——然后您可以在venv 中安装应用程序所需的任何枚举。

【讨论】:

  • 这个,venvs和你可以限制包,不用担心项目之间的尴尬冲突。
  • 哦! import enum; print(enum.__file__) 引导我到 site-packages/ 包含 enum-0.4.6.dist-infoenum34-1.1.6.dist-info,而在 .../site-packages/enum 中安装的一个有一个自述文件,很明显这是 enum34。
  • @Jerry101: 加载的是最后安装的那个。
  • 谢谢,@EthanFurman。使用pip install -r requirements.txt pip 决定安装软件包的顺序。那么如果 requirements.txt 列出了两者,每个人都会得到相同的结果吗?
  • @Jerry101:我不知道。但是,正确的答案是不要那样做。使用其中一个。
【解决方案2】:

在另一个答案中改编@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.__file__ == enum.pyc

我没有大量使用它,它可能并不理想,但它适合我正在查看的内容并且可能对其他人有帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    相关资源
    最近更新 更多