迁移与namedtuples运行的代码

问题描述:

我有一个服务器上运行与namedtuples代码:迁移与namedtuples运行的代码

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

服务器从其他服务器获取事件,走出队列。

我想为我的代码添加一个新功能,需要namedtuple中的一个新属性。有没有一种好的方法来保持向后兼容性?也就是说,我可以停止和启动服务器,代码更改为:

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

但在此期间会有活动具有旧签名排队。

以前有人做过这个吗?

它的工作,因为它是只能出现的问题是在你的代码,当你使用新添加的属性,例如

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是存在的,它应该工作

看看你如何定义你的元组,它应该没有任何问题,只要你不改变属性的顺序。

显然在你的代码,你不应该nowere依赖于一个事实,即元组的长度是3,而不是4.