从旧式枚举到新式枚举的快速更新的安全性

时间:2019-07-02 22:49:07

标签: python enums

假设不是项目,而是NewBreakfast样式的枚举,而不是OldBreakfast样式的枚举。

from enum import Enum


class OldBreakfast:
    HAM = 0x00
    EGGS = 0x01
    PANCAKES = 0x02


class NewBreakfast(Enum):
    HAM = 0x00
    EGGS = 0x01
    PANCAKES = 0x02


def eat():
    food1 = OldBreakfast.HAM
    food2 = NewBreakfast.HAM
    print(food1)
    print(food2)


eat()

从以上代码的eat()中我们可以看到,从“旧”到“新”的一个好处是,单步执行或在这里打印时,人们可以看到正在吃什么,而不是必须回到代码并反向映射代码。

令人愉快的是,将枚举更新为新样式涉及非常有限的操作。特别是,仅定义本身是必要的。其他一切都将通过魔法起作用。

最后一条陈述确实准确吗?有没有需要当心的陷阱?

相关: PEP435 1 2 3 4 5

2 个答案:

答案 0 :(得分:1)

在替换旧代码时,您可能需要使用IntEnum(或StrEnum或...)。例如:

>>> OldBreakfast.HAM == 0
True

>>> NewBreakfast.HAM == 0
False

但是:

>>> IntBreakfast.HAM == 0
True

答案 1 :(得分:0)

该问题中OldBreakfast之类的代码是完全合法的,但是有一个令人信服的理由将其代码升级为NewBreakfast编程风格:易于调试。

快照最能说明问题。在PyCharm中设置断点后,如果我们源自Enum,则枚举的值将提供更多信息。

Deriving from Enum informs us of the definition

看到food2: NewBreakfast.HAM意味着我们不必回头查看代码,而对于food1: 0则是必需的。