1

イベント デリゲート パターンを可能にする検索クラスがあります。他のクラスは、検索が更新されたときに呼び出される関数を登録できます。

問題がある場合、トレースバックはレシーバー関数を示していません。例えば:

私の検索クラスはこれを実行します...

# ----------- 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 に入力すると、この関数が実行されます。パターンは、親ウィジェットが検索ウィジェットを作成し、テキストが変更されたときに呼び出される関数を接続します。これが役立つことを願っています。

4

1 に答える 1

1

onSearchUpdateが class のメソッドであると仮定しFooます:

class Foo(object):
    def __init__(self,search_pattern):
        self.search_pattern=search_pattern
    def onSearchUpdate(self):
        pass #do something with search_pattern

クラスSearchでは、何らかの方法で次のように設定します__updateDelegates

pattern=['foo','bar','baz']

class Search(object):
    def __init__(self):
       self.__updateDelegates=[]
       for i in range(3):
           self.__updateDelegates(Foo(pattern[i]).onSearchUpdate)

onSearchUpdateを介して呼び出すと__updateDelegates、次のようになります。

for func in self.__updateDelegates:
    func()

これはあなたのコードがどのように構造化されているかではないかもしれません (あなたのスニペットでそれを伝えるのは難しすぎます) が、これで問題が明らかになることを願っています。

あるいは、onSearchUpdate2 番目の引数が必要でしょうか?

def onSearchUpdate(self,pattern):
   pass # snip ...
于 2012-07-20T18:42:08.667 に答える