类型对象何时以及为什么比dict更好



我正在调整一家公司提供的一些代码(用于控制仪器(。我自己不是蟒蛇专家,所以我想了解以这样或那样的方式做某事是否有任何特殊的优势。

他们的代码基本上是

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

问题

与普通dict相比,type对象有什么用途/优势?还是上面的例子只是一个坏例子?

带有:

def enum(**enums):
return type('Enum', (), enums)

实际上,您正在创建一个以参数enums的值作为__dict__属性的类,它本身就是一个dict,因此从技术上讲,它并不比dict"更好",但它的用法在语法上比dict更简单,因为:

Inst.RTS

可以说比更容易阅读和打字

Inst['RTS']

使用type的三参数形式类似于定义class:

类类型(名称、基、dict(

使用三个参数,返回一个新的类型对象。这本质上是类语句的动态形式。

您的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的优点是属性由类定义。例如,您可以使用它来键入hint、键入check或引用精确的枚举集。相反,dict只有一些键和某些值——确切的成员是巧合。


请注意,Python自Python 3.4以来就有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()

最新更新