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

3

我正在修改一家公司提供的代码(用于控制仪器)。我本人并不是 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
)

他们使用它来访问上面的“entries”值,例如:
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 相比有什么用处 / 优势?还是上面的例子只是个糟糕的例子?


这似乎只是 enum.Enum 的一个快速而简单的版本,可能是在它被添加到标准库之前,所以我认为这不是一个很好的例子。但在这里,这只是一个风格问题。 - juanpa.arrivillaga
请注意,这里实际上是使用 type 构造函数动态生成一个类对象,即类型对象。您也可以使用 class 语句来完成此操作。 - juanpa.arrivillaga
2个回答

5

使用:

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

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

Inst.RTS

可以说,它比其他方式更易读并且更容易打字。

Inst['RTS']

那么,从概念上讲,“类型”在哪里发挥作用? - SuperCiocia
type 是类对象的类,也称为元类。使用 type('Enum', (), enums),您正在创建一个名为 Enum 的类对象实例,并将 enums 中的键值对作为新类对象的属性。 - blhsing
这个想法显然受到了JavaScript数组点访问器语法的启发。 - Mika Feiler

5
使用 type 的三个参数形式类似于定义一个 class

class type(name, bases, 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 的优点是,类定义了属性的确切意义。例如,您可以使用它来进行类型提示、类型检查或引用确切的枚举集合。相比之下,dict 只有一些键和一些值 -- 具体成员是巧合的。
请注意,自 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接