使用namedtuples迁移正在运行的代码

时间:2012-11-01 00:05:18

标签: python migration queue namedtuple

我在具有namedtuples的服务器上运行代码:

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

服务器正在从队列中获取来自其他服务器的事件。

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

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

但与此同时,会有旧的签名排队的事件。

之前有人这样做过吗?

2 个答案:

答案 0 :(得分: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是否存在,它应该可以工作

答案 1 :(得分:0)

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

显然,在您的代码中,您不应该依赖于元组的长度为3而不是4的事实。