2012-11-01 47 views
2

我有一個服務器上運行與namedtuples代碼:遷移與namedtuples運行的代碼

Event = namedtuple("Event", ['attr1', 'attr2', 'attr3']) 

服務器從其他服務器獲取事件,走出隊列。

我想爲我的代碼添加一個新功能,需要namedtuple中的一個新屬性。有沒有一種好的方法來保持向後兼容性?也就是說,我可以停止和啓動服務器,代碼更改爲:

Event = namedtuple("Event", ['attr1', 'attr2', 'attr3', 'attr4']) 

但在此期間會有活動具有舊簽名排隊。

以前有人做過這個嗎?

回答

1

它的工作,因爲它是隻能出現的問題是在你的代碼,當你使用新添加的屬性,例如

from collections import namedtuple 

Event1 = namedtuple("Event", ['attr1', 'attr2', 'attr3', 'attr4']) 
Event2 = namedtuple("Event", ['attr1', 'attr2', 'attr3', 'attr4', 'attr5']) 

def handle_event(event): 
    print event.attr5 

handle_event(Event2(1,2,3,4,5)) 
handle_event(Event1(1,2,3,4)) 

你會得到錯誤AttributeError: 'Event' object has no attribute 'attr5'因此,如果您在向後兼容的方式照顧這樣的事情,如檢查是否attr5是存在的,它應該工作

0

看看你如何定義你的元組,它應該沒有任何問題,只要你不改變屬性的順序。

顯然在你的代碼,你不應該nowere依賴於一個事實,即元組的長度是3,而不是4.