迁移与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.