Python 对字典中回调的引用

标签 python callback

我有一个指定一组回调函数的类(此处显示为 cb1cb2)。我保留了这些我想在某些事件后调用的 map 。

class Foo:
    cb1 = None
    cb2 = None

    def test(self, input):
        for (name, callback) in map:
            if name == input:
                if callback: callback()
                ...

    map = {'one':cb1, 'two':cb2}

def mycallback():
    print "mycallback()"

f = Foo()
f.cb1 = mycallback  # Register our callback
f.test('one')     # Nothing happens

你能发现问题吗?

发生的事情是,当类被初始化时,cb1cb2(它们都是None) 被复制到 map 中。因此,即使在用户“注册”回调(通过分配给 cb1)之后,映射中的值仍然是 None,并且不会调用任何内容。

由于 Python 中没有“通过引用”这样的东西,我该如何解决这个问题?

最佳答案

为什么不让您的类明确处理注册?

import collections

class Foo(object):
    handlers = None

    def __init__(self):
        self.handlers = collections.defaultdict(set)

    def register(self, event, callback):
        self.handlers[event].add(callback)

    def fire(self, event, **kwargs):
        for handler in self.handlers.get(event, []):
            handler(**kwargs)

foo = Foo()
foo.register('one', mycallback)
foo.fire('one')

关于Python 对字典中回调的引用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7747611/

相关文章:

python - COCO .json 文件的注释中包含奇怪的分段值,如何转换这些值?

c++ - Wxwidgets回调

C#:如何在 F# 中实现为 "async"和 "!"?

python - Xaxis 标签与数据点不匹配 - Pandas/Matplotlib

python - 您可以在 Django 的同一查询中使用 .filter 和 .get 吗?

jquery回调函数

javascript - `queue` 回调只执行一次?

javascript - 通用 Javascript 事件

python - 组合学 - 安排比赛的团队协会

python - 您可以在 LightGBM.train() 中获取每个 boosting 轮的分数吗?