我正在改编公司提供的一些代码(用于控制乐器)。我本人不是Python专家,所以我想了解以一种方式或另一种方式进行操作是否有任何特殊优势。
他们的代码基本上是
def enum(**enums):
return type('Enum', (), enums)
Inst = enum(
CONTINUE = 0,
STOP = 1,
LOOP = 2,
END_LOOP = 3,
JSR = 4,
RTS = 5,
BRANCH = 6,
LONG_DELAY = 7,
WAIT = 8,
RTI = 9
)
,他们使用它来访问上述“条目”的值,例如:
Inst.RTS
% 5
据我了解,Inst
是type
的对象。
出于存储字符串及其关联值的目的,我还可以定义一个dict
:
Inst = {'CONTINUE':0, 'STOP':1, 'LOOP':2, 'END_LOOP':3, 'JSR':4, 'RTS':5}
,然后基本上得到相同的结果:
Inst['RTS']
% 5
问题
与普通的type
相比,dict
对象的用途是什么?还是上面的例子只是一个不好的例子?
答案 0 :(得分:4)
使用:
def enum(**enums):
return type('Enum', (), enums)
您实际上是在使用参数enums
的值作为__dict__
属性创建一个类,这本身就是一个dict,因此从技术上讲,它不比dict更“好”,但是用法在语法上比字典更简单,因为:
Inst.RTS
可以说比它更易于阅读和键入
Inst['RTS']
答案 1 :(得分:4)
使用type
的三参数形式类似于定义class
:
带有三个参数,返回一个新的类型对象。这本质上是 类语句的动态形式。
您的Inst
表达式是明确定义此类的一种不必要的操作,但实际上是等效的:
class Enum:
CONTINUE = 0
STOP = 1
LOOP = 2
END_LOOP = 3
JSR = 4
RTS = 5
BRANCH = 6
LONG_DELAY = 7
WAIT = 8
RTI = 9
Inst = Enum
class
的优点是属性由类很好地定义。例如,您可以使用它来进行提示,类型检查或引用 exact 枚举集。相反,dict
仅具有 some 键和 some 值-确切的成员是巧合的。
请注意,自Python 3.4起,Python具有enum
模块。它允许定义适当的枚举,这些枚举以其他语言复制从枚举已知的功能:
from enum import Enum, auto
class Inst(int, Enum):
CONTINUE = auto()
STOP = auto()
LOOP = auto()
END_LOOP = auto()
JSR = auto()
RTS = auto()
BRANCH = auto()
LONG_DELAY = auto()
WAIT = auto()
RTI = auto()