Python 函数指针的类型

Type of Python function pointer

对于 Python 3,提示函数参数和 return 类型的数据类型对我来说是一个好习惯。例如:

def icecream_factory(taste: str='Banana') -> Ice:
    ice = Ice(taste)
    ice.add_cream()
    return ice

这适用于所有简单的数据类型和类。但是现在我需要将它与 "function pointer":

一起使用
class NotificationRegister:

    def __init__(self):
        self.__function_list = list()
        """:type: list[?????]"""

    def register(self, function_pointer: ?????) -> None:
        self.__function_list.append(function_pointer)

def callback():
    pass

notification_register = NotificationRegister()
notification_register.register(callback)

必须在 ????? 处放置什么才能明确此处需要函数指针?我试过function,因为type(callback)<class 'function'>,但是没有定义关键字function

我会用types.FunctionType来表示一个函数:

>>> import types
>>> types.FunctionType
<class 'function'>
>>>
>>> def func():
...     pass
...
>>> type(func)
<class 'function'>
>>> isinstance(func, types.FunctionType)
True
>>>

您也可以使用字符串文字,例如 'function',但看起来您需要一个实际的类型对象。

一种方法可能是使用 collections.abc.Callable:

>>> import collections.abc
>>> def f(): pass
>>> isinstance(f, collections.abc.Callable)
True

这适用于实现 __call__ 的所有对象。这是相当广泛的,因为对于碰巧实现 __call__ 的实例或其他对象的方法,它也是 True。但这可能是您想要的 - 这取决于您是只想接受函数还是其他可调用对象。

使用Typing.Callable: https://docs.python.org/3/library/typing.html

Frameworks expecting callback functions of specific signatures might be type hinted using Callable[[Arg1Type, Arg2Type], ReturnType].

For example:

from typing import Callable

def feeder(get_next_item: Callable[[], str]) -> None: # Body

def async_query(on_success: Callable[[int], None], on_error: Callable[[int, Exception], None]) -> None: # Body It is possible to declare the return type of a callable without specifying the call signature by substituting a literal ellipsis for the list of arguments in the type hint: Callable[..., ReturnType].

1.基本思路

在 python.
中显示函数回调类型的基本概念 期望特定签名的回调函数的框架可能会在使用

时被类型提示
Callable[[Arg1Type, Arg2Type], ReturnType]

在你的例子中,你想使用不带参数的函数 callback() 和 return。 所以它将是 Callable[[], None]

2。代码可以工作

我改进你的代码以支持上述想法。
然后,你可以运行这个代码,结果就正确了。

from typing import Callable
class NotificationRegister:

    def __init__(self):
        self.__function_list:List[Callable[[],None]] = list()

    def register(self, function_pointer: Callable[[], None]) -> None:
        self.__function_list.append(function_pointer)

def callback():
    pass

notification_register = NotificationRegister()
notification_register.register(callback)

3。更多细节学习

此处的更多信息让您更了解如何在 python 中使用不同类型的函数回调。

Callable的文档在下面,但是使用from typing import Callable比使用from collections.abc import Callable[=44更好=] 在我的 python 3.7 环境中。

所以我建议如果你的环境是 python3.7.
,你可以使用 typing 而不是 collections.abc

如果你想了解更多,那么你可以阅读这篇完整的文档 https://docs.python.org/3/library/typing.html