Python对字典中回调的引用

Jon*_*art 6 python callback

我有一个类,它指定了一组回调函数(此处显示为cb1cb2).我保留了一些地图,我想在一些事件后打电话给我.

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
Run Code Online (Sandbox Code Playgroud)

你能发现问题吗?

会发生什么事是,当类初始化时,cb1cb2(这两者都是None)被复制到地图.因此,即使用户'注册'回调(通过分配cb1),地图中的值仍然None没有被调用.

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

pat*_*rys 12

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

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')
Run Code Online (Sandbox Code Playgroud)