Python中的枚举类型如何提高代码的可读性

枚举是编程语言中常见的数据类型,如c、c++和java。它们可以帮助您编写类型安全且更易读的代码。

在python中,枚举并不总是被支持的。然而,自3.4版本以来,python现在支持枚举。本文是关于如何创建枚举,如何使用它们以及它们如何提高代码可读性的指南。

枚举是什么,它们能做什么?

枚举或枚举是由其可以取得的值集合定义的数据类型。这个值集合被称为其成员集。枚举使您能够更严格地定义变量可能具有的值。这有助于您编写类型安全的代码。它还提高了可读性。

一些需要了解的术语

在我们讨论枚举时,有一些术语需要首先定义,因为我们将经常使用它们。这些术语是成员和值。

  • 成员:这些是形成属于枚举的一组值的命名常量。例如,days枚举可能包含以下成员:sunday,monday,tuesday等。
  • :这些是用于以不同方式表示每个枚举成员的内部值。这将使比较成为可能。例如,在days枚举中,sunday的值可以为0,monday的值可以为1,tuesday的值可以为2,等等。

现在,我们将讨论枚举如何改进您的代码。

枚举如何提高您的代码

枚举可以改进您的代码,使其更易读,减少错误。以下是一些使用它们的原因:

  • 枚举使您能够清楚地定义变量或函数参数期望的值。清楚地表达对变量或函数参数的意图使人们能够轻松理解您的代码。
  • 枚举还使您的代码自文档化。这意味着您不必添加注释或文档来指定函数期望的值。相反,您的枚举指定了预期的值。
  • 这还使ide能够在传递不正确的值时突出显示错误并提供自动完成支持。
  • 结果,您的代码变得类型安全,不太可能产生运行时错误。

接下来,我们将讨论如何在python中创建枚举。

如何在python中创建枚举

python不支持枚举。但它在标准库中提供了一个枚举模块。我们将在本教程中使用该模块。在python中创建枚举有两种方法:类或函数api。我将在本节中涵盖两者。

先决条件

要按照本教程操作,您需要安装python 3.4。该版本的python带有标准库中的枚举模块。如果您还没有安装,请参考以下教程:

要按照本教程操作,您需要了解一些python知识。这包括基本的python和更高级的面向对象编程概念,如类和继承。

#1. 类方法

创建枚举的第一种方法是使用类。首先从enum模块导入枚举类。接下来,创建一个类来创建您的枚举。这个类将继承您之前导入的enum类。

from enum import enum

class direction(enum):
    north = 0
    east = 1
    south = 2
    west = 3

您还可以为枚举的成员分配任何您想要的值。以下是一个示例:与其将0、1、2和3分配给我们的方向枚举,我们将它们分配为相应的头部值0、90、180和270。

from enum import enum

class direction(enum):
    north = 0
    east = 90
    south = 180
    west = 270

或者,使用range函数是一种更简洁的生成上述内容的方式。下面的代码片段演示了如何使用range函数:

from enum import enum

class direction(enum):
    north, east, south, west = range(0, 360, 90)

在本例中,我们使用range函数生成值。我们将0指定为起始值,360指定为结束值,90指定为递增值。我们从可迭代对象中解构这些值,类似于解构元组的方式。如果想要了解有关元组解构的更多信息,请阅读这篇关于 tuples in python 的文章。

枚举类是抽象类。这意味着它们不能被实例化。相反,它们的属性,即枚举成员,在这种情况下是直接访问的。

#2. 函数方法

函数方法是子类化方法的替代方法。

from enum import enum

direction = enum("direction", ["north", "east", "south", "west"])

在上面的代码片段中,我们创建了一个名为direction的枚举。它可以使用四个成员进行访问,我们将这些成员作为第二个参数提供。默认情况下,这些成员被赋予从1开始的值。因此,north是1,east是2,依此类推。这是因为0是false而不是预期的从零开始的索引。为了使所有值为true,将值从1开始编号。

或者,您可以通过将成员作为元组列表传递来为成员分配值。每个元组由两个元素组成:成员的名称和该成员的值。

from enum import enum

direction = enum(
    name = "direction",
    values = [
        ("north", "n"),
        ("east", "e"),
        ("south", "s"),
        ("west", "w"),
    ]
)

您还会注意到,在上面的示例中,我使用了字符串而不是整数来为成员分配值。这证明了在分配值时,字符串和整数都是有效的。

如何使用枚举

在前一节中,我们介绍了创建枚举并为成员分配值的方法。本节将介绍使用枚举来访问和分配成员以及检查相等性。

如何访问成员

有多种方法可以访问枚举的成员。这些方法包括点语法、括号和方括号语法。下面是一个示例,以演示上述方法:

from enum import enum

# 创建一个枚举
class day(enum):
    sunday, monday, tuesday, wednesday, thursday, friday, saturday = range(1, 8)

# 访问枚举成员
# 1. 使用点语法
print(day.sunday)

# 2. 使用方括号
print(day["monday"])

# 3. 使用括号
print(day(3))

在访问枚举成员后,你可以将其存储在一个变量中。请注意,访问成员会给你一个对成员对象的引用,而不是其值或名称。这在接下来的几个部分中需要记住。

访问名称和值

如前所述,当你访问枚举成员时,你创建了对成员对象的引用。如果出于某种原因,你想要访问枚举对象的名称或值,可以使用对象上的name和value属性。

print(day.sunday.name, day.sunday.value)

检查相等性

回想一下,将枚举成员分配给一个变量会创建对枚举成员对象的引用。因此,要检查变量是否具有特定的枚举成员,我们使用is运算符来检查枚举成员和变量是否指向同一个对象。

下面是一个示例来演示:

today = day.wednesday

if today is day.monday:
    print("今天是星期一,:(")

if today is day.wednesday:
    print("快乐的星期三")

另外,你可以使用==运算符。在enum类的超类上,==运算符是is运算符的一个包装器。这是通过操作符重载来实现的。你可以在这篇文章中阅读更多相关内容:magic methods。无论如何,这是一个使用==而不是is的示例。

today = day.wednesday

if today == day.monday:
    print("今天是星期一,:(")

if today == day.wednesday:
    print("快乐的星期三")

冒昧地说,枚举比较检查对象的身份,而不是值。

最后的话

本文介绍了枚举是什么以及它们为什么有用。我们还介绍了通过子类化enum类和使用功能api来创建枚举的不同方法。

此外,我们还介绍了如何使用枚举、访问值和进行比较。接下来,你可能想阅读我们关于typescript枚举的文章。

类似文章