関数がヒープリストの要素を変更するたびにコールバック通知を取得したいと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)
次に、インスタンスを作成し、List2heapify を呼び出します。
h = List2([12, -3, 0, 5, 1, 7])
heapq.heapify(h)
問題は、オーバーライドさ__setitem__れた が 内から呼び出されないことheapq.heapifyです。heapq.heapifyList2 のインスタンスをデフォルトのリストであるかのように扱っているようです。それが組み込み関数であるという事実と関係があると思いますが、heapq.heapifyまだわかりません。
オーバーライドさ__setitem__れたものが呼び出されないのはなぜheapq.heapifyですか?
ここで興味深いのは、heapq のコードをローカル モジュールにコピー アンド ペーストすると (つまり、組み込み関数ではなくなります)、期待どおりに動作し、 へList2.__settiem__の呼び出しが発生しますが、デフォルトでは動作しません (内蔵) heapq.
問題がある場合はPython 2.7