何时以及为什么类型对象比字典更好?

Sup*_*cia 3 python dictionary

我正在改编公司提供的一些代码(用于控制仪器)。我自己不是 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
)
Run Code Online (Sandbox Code Playgroud)

他们使用它来访问上述“条目”的值,例如:

Inst.RTS
% 5
Run Code Online (Sandbox Code Playgroud)

按照我的理解,Inst是一个type对象。


为了存储字符串及其相关值,我还可以定义一个dict

Inst = {'CONTINUE':0, 'STOP':1, 'LOOP':2, 'END_LOOP':3, 'JSR':4, 'RTS':5}
Run Code Online (Sandbox Code Playgroud)

然后基本上得到相同的结果:

Inst['RTS']
% 5
Run Code Online (Sandbox Code Playgroud)

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

blh*_*ing 5

和:

def enum(**enums):
    return type('Enum', (), enums)
Run Code Online (Sandbox Code Playgroud)

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

Inst.RTS
Run Code Online (Sandbox Code Playgroud)

可以说比它更容易阅读和更容易输入

Inst['RTS']
Run Code Online (Sandbox Code Playgroud)


Mis*_*agi 5

使用三参数形式的type类似于定义 a 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
Run Code Online (Sandbox Code Playgroud)

a 的优点class是属性由类定义良好。例如,您可以使用它来进行类型提示、类型检查或引用确切的枚举集。相比之下, adict只有一些键和一些值——确切的成员是巧合。


请注意,Pythonenum自 Python 3.4 起就有该模块。它允许定义适当的枚举,以复制其他语言枚举中已知的功能:

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()
Run Code Online (Sandbox Code Playgroud)