2

我在带有命名元组的服务器上运行代码:

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

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

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

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

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

以前有人做过吗?

4

2 回答 2

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

于 2012-11-01T00:24:50.930 回答
0

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

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

于 2012-11-01T00:23:11.447 回答