我的代码在带有名称的服务器上运行:
Event = namedtuple("Event", ['attr1', 'attr2', 'attr3'])
服务器正在从其他服务器中获取事件,从队列出来。
我想在我的代码中添加一个新功能,该功能需要在名为tuple中的新属性。有没有一个很好的方法来保持兼容性?也就是说,我可以停止并启动服务器,然后将代码更改为:
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是否存在,它应该有效
查看您如何定义元组,只要您不更改属性的顺序,它应该无需任何问题即可。
显然在您的代码中,您现在不应该依靠元组长3而不是4。