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
对于 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