我在具有namedtuples的服务器上运行代码:
Event = namedtuple("Event", ['attr1', 'attr2', 'attr3'])
服务器正在从队列中获取来自其他服务器的事件。
我想在我的代码中添加一个新功能,该功能需要在namedtuple中有一个新属性。有没有一个很好的方法来做到这一点并保持向后兼容性?也就是说,我可以停止并启动服务器,并将代码更改为:
Event = namedtuple("Event", ['attr1', 'attr2', 'attr3', 'attr4'])
但与此同时,会有旧的签名排队的事件。
之前有人这样做过吗?
答案 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的事实。