常用数据结构-namedtuple(命名元祖)

namedtuple从根本上来说是一个带有数据名称的元祖。它包含元祖的所有特性,但也有一些元祖没有的额外特性。使用namedtuple可以很容易创建轻量级对象类型。

namedtuple将是你的代码更加具有python特色。

  1. 访问数据
    使用namedtuple访问数据可以提高代码的可读性。如果想创建一个类,使其值在初始化后不会被更改。可以创建一个类:
class Point:
    def __init__(self, x, y):
        self.x = x
        self.y = y

point = Point(3, 4)
point.x
point.y

使用namedtuple可以更加提高代码可读性:

Point = namedtuple("Point", ['x', 'y'])
point = Point(x=3, y=4)
point.x
point.y

无论是否被命名,元祖都是不可变的。namedtuple通过使用名称访问而不是索引访问,使访问数据更加方便。
namedtuple还有一个严格的限制,即字段名必须是字符串。此外,namedtuple不执行任何散列操作。

  1. 返回数据
    使用元祖返回数据使代码在没有太多上下文的情况更具有可读性。当数据从一个函数传递到另一个函数时,应该考虑是否可以使用namedtuple。
def get_user_info(user_obj):
    user = get_data_from_db(user_obj)
    first_name = user.get('first_name')
    last_name = user.get('last_name')
    age = user.get('age')
    return (first_name, last_name, age)

def get_full_name(first_name, last_name):
    return first_name + last_name

first_name, last_name, age = get_user_info(user_obj)
full_name = get_full_name(first_name, last_name)

使用namedtuple:

def get_user_info(user_obj):
    user = get_data_from_db(user_obj)
    UserInfo = namedtuple('UserInfo', ['first_name', 'last_name', 'age'])
    user_info = UserInfo(first_name=user.get('first_name'),
                         last_name=user.get('last_name'),
                         age=user.get('age'))
    return user_info

def get_full_name(user_info):
    return ''.join(user_info.first_name, user_info.last_name)

user_info = get_user_info(user_obj)
full_name = get_full_name(user_info)

使用namedtuple编写代码会给出上下文,而不需要再代码中提供额外的信息。user_info作为namedtuple给出了额外的上下文,而没有
在函数get_user_info中返回时显示设置。因此,使用namedtuple可以使代码在长期运行状态下更加具有可读性合可维护性。

在认为对象表示法会时代码更符合python风格和更具备可读性的地方,即应该使用namedtuple,而不是tuple;当有多个值需要在上下文传递时,
可以优先考虑使用namedtuple,可使代码可读性更强。