我有一个允许事件委托模式的搜索类。其他类可以注册一个函数,以便在搜索更新时调用。
当出现问题时,回溯不会显示接收器功能。例如:
我的搜索类运行此。。。
# ----------- 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时,它会运行此函数。因此,模式是,父小部件创建搜索小部件,然后连接其函数,以便在文本更改时调用。我希望这能有所帮助。
假设onSearchUpdate
是类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)
现在,当您通过__updateDelegates
呼叫onSearchUpdate
时,您只需执行以下操作:
for func in self.__updateDelegates:
func()
这可能不是你的代码的结构(用你的代码片段很难判断),但希望这能说明问题。
或者,也许onSearchUpdate
应该有第二个参数?
def onSearchUpdate(self,pattern):
pass # snip ...