【问题标题】:Safety of a quick update from old- to new-style enumeration从旧式枚举到新式枚举的快速更新的安全性
【发布时间】:2019-11-13 14:23:43
【问题描述】:

而不是NewBreakfast-style enums,假设在一个项目中你仍然有OldBreakfast-style enums,Python2天的剩余物。

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()ing 所看到的,从“旧”迁移到“新”的一个好处是,在单步执行时,或者在这里打印时,人们可以看到自己在吃什么,而不是必须回到代码并反向映射代码。

令人高兴的是,将枚举更新为新样式涉及的操作非常有限。特别是,只有定义本身是必要的。其他一切都会变魔术。

最后这句话真的准确吗?有没有需要注意的陷阱?

相关: PEP435 1 2 3 4 5

【问题讨论】:

    标签: python enums


    【解决方案1】:

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

    >>> OldBreakfast.HAM == 0
    True
    
    >>> NewBreakfast.HAM == 0
    False
    

    但是:

    >>> IntBreakfast.HAM == 0
    True
    

    【讨论】:

    • 我明白了。好的。但我想说,任何针对常量进行测试的实例都是代码中的缺陷,这将是揭示它们以删除它们的好机会,从这个意义上说,NewBreakfast 有一个优势,如果是一个奇怪的优势,那就是人们将有很大的机会找到他们在哪里,希望通过失败的测试而不是模糊的崩溃。
    【解决方案2】:

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

    一张快照最能说明问题。在 PyCharm 中设置断点后,如果我们从 Enum 派生,枚举的值会提供更多信息。

    看到food2: NewBreakfast.HAM 意味着我们不必回头查看代码,而food1: 0 则必须这样做。

    【讨论】:

      猜你喜欢
      • 2011-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-12
      • 1970-01-01
      • 2015-12-10
      相关资源
      最近更新 更多