移植C定义了Pythonic方式

Pea*_*nut 6 python enums constants

tl; dr什么是Pythonic(Py 3)指定大量定义的位掩码和常量的方法?使用枚举或只是将一组consts作为类变量?和优点/缺点?

背景

我正在将C代码移植到Python 3.在C代码中有大量定义用作位掩码:

#define ERR_1 = 0x8
#define ERR_2 = 0x2
#define ERR_4 = 0x100
...
Run Code Online (Sandbox Code Playgroud)

我认为在Python中使用Pythonic的方法是使用a Enum,我遇到了IntEnum这意味着我不必.value像往常一样在任何地方使用它Enum:

from enum import IntEnum

class Errors(IntEnum):
    BROKEN = 0x8
    FUBARED = 0x4
    GIVEUP = 0x7

print(0xFF & Errors.BROKEN)
Run Code Online (Sandbox Code Playgroud)

但是,print(0xFF & ERR_1)如果我将它们全部作为有力的话,它仍然比我能得到的更加冗长.

Fil*_*zak 1

我认为使用enum更Pythonic - 创建该模块付出了很多努力,这并不是没有原因的。

“标准”方式是使用常量(例如ERR_1),但这很丑陋,有缺陷,而且很难维护。这就是开发该模块的原因。

既然我已经给出了简单的答案,我还可以建议您同时使用两者:

ERR_1 = 0x8
ERR_2 = 0x4
ERR_3 = 0x7

class Errors(IntEnum):
    BROKEN = ERR_1
    FUBARED = ERR_2
    GIVEUP = ERR_3

print(0xFF & Errors.BROKEN)
print(0xFF & ERR_1)
Run Code Online (Sandbox Code Playgroud)

我认为这很丑陋,但你在两种选择之间左右为难,所以我想向你展示如何使它们成为一种选择。

还值得一读: