Python API中的“注册回调”一词是什么意思?

use*_*984 3 python python-3.x

我正在尝试详细介绍Python 3 API的设计方式,当使用提供python 3.x解释器的应用程序内部可用模块中的API使用API​​将元素添加到UI时,要求我注册一个回调以便能够使用我的函数/脚本:从Cpython的角度来看,“注册回调”是什么意思?

And*_*ark 6

回调

在计算机编程中,回调是一段可执行代码,它作为参数传递给其他代码,期望在某个方便的时间回调(执行)该参数。调用可能是即时的,如在同步回调中​​,也可能在稍后发生,如在异步回调中。

因此,如果您正在向 UI API 注册回调,那么您可能会将您创建的某个函数传递给另一个函数,该函数将负责在某些条件发生时调用您的函数。

例如,您可能在 UI 中有一个按钮,并且您希望在单击该按钮时执行一些代码。您可能会注册一个如下所示的回调:

def onclick():
    print 'Button clicked!'

# call the onclick() method when the 'click' event happens on the button
some_api.register_callback(button, 'click', onclick)
Run Code Online (Sandbox Code Playgroud)

API 代码可能如下所示:

# global variable containing callbacks
callbacks = {}

# API for registering callbacks
def register_callback(obj, event, callback):
    if obj not in callbacks:
        callbacks[obj] = {}
    callbacks[obj][event] = callback

# a function that is called when some event is triggered on an object
def process_event(obj, event):
    if obj in callbacks and event in callbacks[obj]:
        # this object/event pair has a callback, call it
        callback = callbacks[obj][event]
        callback()
Run Code Online (Sandbox Code Playgroud)


mgi*_*son 5

通常,这意味着您创建一个函数:

def foo(some,arguments):
    pass #do something here
Run Code Online (Sandbox Code Playgroud)

然后将该函数传递给提供的API中的某个类:

API_class_instance.register_callback(foo)
Run Code Online (Sandbox Code Playgroud)

现在,API_class_instancefoo在有记录的情况下致电。

  • @user2244984 -- register 不需要知道 `foo` 的 `type`。只要它可以根据文档化的 API *调用 * foo,就可以了。然而,如果你做`API_class_instance.register_callback(2)`,那么当`API_class_instance`实际上想要*调用*回调时你可能会遇到问题(因为这里我们传递了一个不可调用的回调) (2认同)
  • @ user2244984 Python是一种“强类型化”语言,肯定是一种“类型”概念。函数是FunctionType的实例。并不是像C那样,每个不同的签名都被认为是不同的类型,但这是一个细节。通过它们的方式:有一些方法可以知道可调用的接受参数和其他信息的数量,但是很少使用它们,因为它们没有提供太多好处,违反了python的原理,并且增加了代码的复杂性。 (2认同)