関数がヒープリストの要素を変更するたびにコールバック通知を取得したいとheapq.heapify
思います (これは、リスト内のオブジェクトとそのインデックスがどのように変更されるかを追跡するために必要です)。
私の計画は、リスト内の変更を追跡するメソッドからサブクラス化し、メソッドlist
をオーバーライドすることでした。__setitem__
したがって、ここにサブクラスがあります:
class List2(list):
def __setitem__(self, key, value):
print 'setitem: key=',key,' value=',value
list.__setitem__(self, key, value)
def __getitem__(self, key):
print 'getitem: key=',key
return list.__getitem__(self, key)
次に、インスタンスを作成し、List2
heapify を呼び出します。
h = List2([12, -3, 0, 5, 1, 7])
heapq.heapify(h)
問題は、オーバーライドさ__setitem__
れた が 内から呼び出されないことheapq.heapify
です。heapq.heapify
List2 のインスタンスをデフォルトのリストであるかのように扱っているようです。それが組み込み関数であるという事実と関係があると思いますが、heapq.heapify
まだわかりません。
オーバーライドさ__setitem__
れたものが呼び出されないのはなぜheapq.heapify
ですか?
ここで興味深いのは、heapq のコードをローカル モジュールにコピー アンド ペーストすると (つまり、組み込み関数ではなくなります)、期待どおりに動作し、 へList2.__settiem__
の呼び出しが発生しますが、デフォルトでは動作しません (内蔵) heapq
.
問題がある場合はPython 2.7