イベント デリゲート パターンを可能にする検索クラスがあります。他のクラスは、検索が更新されたときに呼び出される関数を登録できます。
問題がある場合、トレースバックはレシーバー関数を示していません。例えば:
私の検索クラスはこれを実行します...
# ----------- Search.py -----------
# class Search ...snip...
def connect(self, fn):
self.__updateDelegates.append(fn)
def onTextChanged(self):
# ...snip...
# Execute all event delegates
for fn in self.__updateDelegates:
fn(search_pattern)
...デリゲート関数の署名が間違っている場合...
# ----------- Foo.py -----------
from search import Search
# class Foo ...snip...
def __init__(self):
search = Search()
search.connect(self.onSearchUpdate)
def onSearchUpdate(self): # <- Wrong on purpose. Should have another argument
# Do something.
...私はこれを見る...
# Traceback (most recent call last):
# File "search.py", line 287, in onTextChanged
# fn(search_pattern)
# TypeError: onSearchUpdate() takes exactly 1 argument (2 given)
例外メッセージのデリゲート関数名は正しいが、トレースバックはそこまで到達していないことに注意してください。
エラーは、デリゲート署名にパターン引数が必要なためです。問題は、このエラーが発生している場所がトレースバックに表示されないことです。参照が指している関数オブジェクトまでさかのぼる必要があります。
これを修正する方法はありますか?
注: コードと説明を更新しました。追加のコードで問題を混乱させたくはありませんでしたが、もっと表示する必要があると感じました。これは、機能をトリガーするものを示していませんonTextChanged()
。これは実際には Qt ウィジェットの実装の一部であり、誰かが QLineEdit に入力すると、この関数が実行されます。パターンは、親ウィジェットが検索ウィジェットを作成し、テキストが変更されたときに呼び出される関数を接続します。これが役立つことを願っています。