2012年1月20日 星期五

[Python]named tuple

在Python裡頭有一個很好用的container叫做named tuple,他可以用來建立一個自己定義的class並且具有原本tuple的所有功能
這樣說可能有點難懂,以下是一個實際使用的例子:

Point = collections.namedtuple("Point", "x y")

collections.namedtuple()的第一個參數是自己定義的class名稱。第二個參數則是class中有的data名稱所組成的字串
由空格隔開不同的data名稱。當呼叫此function後,會回傳一個自己定義的class
我們就可以把他當作其他Python常見的class來使用(ex: list)
在此範例中,定義了一個namedtuple()幫我們建立了一個Point的class,其中有x和y這兩個data member
因此可以這樣使用他:
p = Point(100, 200)
print(p.x, p.y)
Output:
100, 200

named tuple的作法是去繼承tuple,並根據使用者給的參數產生出一個新的class,因此原本tuple的功能也可以在named tuple中使用
x, y = p         # unpack like a regular tuple

named tuple有幾個好用的地方,比如說從資料庫、csv檔的時候,可以直接讀到我們自己定義的named tuple中
EmployeeRecord = namedtuple('EmployeeRecord', 'name, age, title, department, paygrade')

import csv
for emp in map(EmployeeRecord._make, csv.reader(open("employees.csv", "rb"))):
    print(emp.name, emp.title)

或是從檔案讀入資料,下列範例從檔案讀取資料經過處理後存到用named tuple自己定義的User class中
User = collections.namedtuple("User", "username hashed_password id")
users = []
for line in open(filename):
    fields = line.split(":")
    user = User(fields[USERNAME], fields[HASHED_PASSWORD], fields[ID]) 
    users.append(user)

使用named tuple會直接套用預設的class template產生簡單的class,此方法讓程式碼可讀性提高很多
使用起來也相當便利,省去了自己宣告class定義資料型態所花的時間

沒有留言:

張貼留言