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

タプルをどのように定義したかを見ると、属性の順序を変更しない限り、問題なく機能するはずです。

明らかに、コードでは、タプルの長さが 4 ではなく 3 であるという事実に頼るべきではありません。

于 2012-11-01T00:23:11.447 に答える