常用資料結構-namedtuple(命名元祖)

1024發表於2020-11-02

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,可使程式碼可讀性更強。

相關文章