执行委托函数时,为什么这个Python回溯会很糟糕

时间:2012-07-20 18:17:18

标签: python events delegates callable traceback

我有一个允许事件委托模式的搜索类。其他类可以在搜索更新时注册要调用的函数。

当出现问题时,回溯未显示接收器功能。例如:

我的搜索类运行此...

# ----------- 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时它会运行此功能。因此模式是,父窗口小部件创建搜索窗口小部件,然后连接其在更改文本时要调用的函数。我希望这会有所帮助。

1 个答案:

答案 0 :(得分:1)

假设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)

现在,当您通过onSearchUpdate致电__updateDelegates时,您只需执行以下操作:

for func in self.__updateDelegates:
    func()

这可能不是你的代码结构的方式(用你的代码片段来判断它太难了),但希望这可以解决这个问题。

或者,也许onSearchUpdate应该有第二个参数?

def onSearchUpdate(self,pattern):
   pass # snip ...