Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
这句话的意思是什么;正在注册回调";使用Python API?_Python_Python 3.x - Fatal编程技术网

这句话的意思是什么;正在注册回调";使用Python API?

这句话的意思是什么;正在注册回调";使用Python API?,python,python-3.x,Python,Python 3.x,我试图深入了解Python3 API是如何设计的,当使用提供Python3.x解释器的应用程序中可用的模块中的API向UI添加元素时,我被要求注册回调以便能够使用我的函数/脚本:“注册回调”是什么意思从Cpython的角度来看是指?通常,这意味着您创建了一个函数: def foo(some,arguments): pass #do something here 然后将该函数传递给所提供API中的某个类: API_class_instance.register_callback(foo)

我试图深入了解Python3 API是如何设计的,当使用提供Python3.x解释器的应用程序中可用的模块中的API向UI添加元素时,我被要求注册回调以便能够使用我的函数/脚本:“注册回调”是什么意思从Cpython的角度来看是指?

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

def foo(some,arguments):
    pass #do something here
然后将该函数传递给所提供API中的某个类:

API_class_instance.register_callback(foo)
现在,
API\u class\u实例
将在记录的情况下调用
foo

在计算机编程中,回调是作为参数传递给其他代码的一段可执行代码,这些代码希望在方便的时候回调(执行)参数。调用可以像在同步回调中那样立即进行,也可以像在异步回调中那样在稍后进行

因此,如果您正在注册一个对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)
# 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()
API代码可能如下所示:

def onclick():
    print 'Button clicked!'

# call the onclick() method when the 'click' event happens on the button
some_api.register_callback(button, 'click', onclick)
# 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()

传递福的目的是什么?register()知道foo()的类型?既然Python下没有真正的类型概念,我想知道这有什么意义?基本上我现在可以在register()中抛出任何东西。@user2244984——register不需要知道
foo
类型。只要它能够根据记录在案的API调用foo,那么就可以了。但是,如果您执行
API\u class\u instance.register\u callback(2)
,那么当
API\u class\u instance
实际想要调用回调时,您可能会遇到问题(因为这里我们传递了一个不可调用的回调),因此基本上没有过滤器或真正的标准来确定我可以向register()提供什么,以及“如果我的脚本没有崩溃”可能还可以吗?@user2244984 Python是一种强类型语言,肯定有类型的概念。函数是
函数类型
的实例。它不像C,每个不同的签名都被视为不同的类型,但这是一个细节。顺便说一句:有很多方法可以知道一个可调用的accept和其他信息有多少个参数,但很少使用,因为它们没有提供太多好处,违背了python的理念,增加了代码的复杂性。如果API是C模块呢?如何在C/C++中实现异步回调?您是否在问,如果API在C中实现,API将如何调用传入的函数?可能是使用and then。更像是传递给register()的foo对象的命运是什么,这个register()背后的设计是如何的,有一个数据结构吗?事件链?这取决于API,一些将使用数据结构,另一些将使用触发回调的对象存储回调。例如,按钮可能具有onclick属性,您可以使用
button.onclick=some\u callback
注册回调。