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)如果我将它们全部作为有力的话,它仍然比我能得到的更加冗长.
我认为使用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)
我认为这很丑陋,但你在两种选择之间左右为难,所以我想向你展示如何使它们成为一种选择。
还值得一读:
enum模块的参数