使用 Python 命名元组增强代码清晰度
了解如何创建、解构和优化内存使用,以获得更简洁、更易读的代码。探索实际示例和最佳实践。
Python 的集合模块有一个称为“Namedtuple”的功能,“Namedtuple”是一个带有命名元素的元组,使代码更具表现力。就像 Python 中的字典一样,“Namedtuple”允许我们使用元组的成员而不是索引来访问元素。
创建命名元组
要创建一个命名元组,我们必须使用集合模块中的函数“namedtuple”。
from collections import namedtuple
# Define a employee tuple that has fields id, name and location.
Employee = namedtuple ('Employee', 'id name location')
# Create instances of Employee
employee1 = Employee (id=10, name='John Doe', location='Atlanta')
employee2 = Employee (id=11, name='Mick', location='Dallas')
从 Namedtuple 访问元素
“Namedtuple”为元素访问提供了双重机制。首先,可以通过属性名称访问元素,第二种机制使用传统的数字索引。
print(f"{employee1.name} - {employee1.location}") # John Doe - Atlanta
print(f"{employee2.name} - {employee2.location}") # Mick – Dallas
也可以使用数字索引访问元素。
print(f"{employee1[1]} - {employee1[2]}") # John Doe - Atlanta
print(f"{employee2[1]} - {employee2[2]}") # Mick – Dallas
不可变性
不可变性是“Namedtuples”的基本属性,继承自常规元组。这意味着一旦在创建过程中设置了字段的值,就无法修改。
try:
employee1.name = 'David'
except AttributeError as e:
print(f"AttributeError: {e}") # AttributeError: can't set attribute
方法
“Namedtuple”不仅提供了一种干净且可读的方法来构建数据,而且还提供了一些有用的方法,这些方法增强了“Namedtuple”的功能。
a) _asdict():_asdict() 方法以字典形式返回命名元组,提供了一种将“Namedtuples”转换为与其他数据结构兼容的格式的便捷方法。
employee1._asdict() # {'id': 10, 'name': 'John Doe', 'location': 'Atlanta'}
b) _replace():_replace() 方法创建“Namedtuple”的新实例,其中指定的字段替换为新值。这种方法对于在允许修改的同时保持不可变性至关重要。
employee1_modified = employee1._replace(location='DFW')
employee1_modified # Employee(id=10, name='John Doe', location='DFW')
c) _make():_make(iterable) 方法从可迭代对象创建“namedtuple”的新实例。例如,我们可以使用 _make() 方法从列表中创建一个 Namedtuple。
employee_list = [21, 'Bob','Gallup']
Employee._make(employee_list) # Employee(id=21, name='Bob', location='Gallup')
解压缩 Namedtuple
通过解包过程,Python 的“Namedtuples”使您能够在单个简洁的语句中将它们的值分配给各个变量。
id, name, location = employee1
print(f"id: {id}, name: {name}, location:{location}")
将“Namedtuples”转换为不同的数据结构
您可以使用 list() 构造函数将命名元组转换为列表。下面是一个示例:
list(employee1) # [10, 'John Doe', 'Atlanta']
您可以使用“_asdict()”方法将命名元组转换为字典,该方法返回一个 OrderedDict,您可以将其转换为常规字典。下面是一个示例:
dict(employee1._asdict()) # {'id': 10, 'name': 'John Doe', 'location': 'Atlanta'}
使用“Namedtuple”的优点
可读性:“Namedtuples”通过为元素提供有意义的名称,使代码更具可读性,从而消除了基于索引的访问的需要。
变:与常规元组一样,“Namedtuples”是不可变的。一旦创建,其值就无法更改。
内存效率:“Namedtuples”具有内存效率,与等效类相比,占用的空间更少。请务必注意,使用 Namedtuples 获得的内存效率在涉及大量实例的方案或处理大型数据集时更为常见。
轻量级数据结构: 非常适合创建简单的类,而无需自定义方法。
数据存储: 便于存储结构化数据,尤其是在不需要完整类的情况下。
API 和数据库记录: 用于表示从数据库返回的记录或从 API 接收的数据。
Python 中的“Namedtuple”非常适合需要具有命名字段的简单、不可变数据结构的场景,例如
配置设置:使用“Namedtuple”表示带有命名字段的配置设置,以便清晰易用。
数据库记录:“Namedtuple”可以表示数据库记录,明确哪个字段对应于表中的哪一列。
命令行解析:使用“Namedtuple”存储解析的命令行参数,为输入参数提供清晰的结构。
命名常量:“Namedtuple”可用于表示代码中的命名常量,从而提供一种清晰易读的方式来定义常量值。
“Namedtuples”通过提供清晰度、可读性和不可变性在这些场景中表现出色,使其成为简明结构化数据的宝贵工具。