对于Python 3,它对我来说是一个很好的做法,提示函数参数和返回类型的数据类型。例如:
def icecream_factory(taste: str='Banana') -> Ice:
ice = Ice(taste)
ice.add_cream()
return ice
这适用于所有简单数据类型和类。但现在我需要使用"函数指针":
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
。
答案 0 :(得分:7)
我会使用types.FunctionType
来表示一个函数:
>>> import types
>>> types.FunctionType
<class 'function'>
>>>
>>> def func():
... pass
...
>>> type(func)
<class 'function'>
>>> isinstance(func, types.FunctionType)
True
>>>
您也可以使用字符串文字,例如'function'
,但看起来您想要一个实际的类型对象。
答案 1 :(得分:1)
一种方法可能是使用collections.abc.Callable
:
>>> import collections.abc
>>> def f(): pass
>>> isinstance(f, collections.abc.Callable)
True
这适用于实现__call__
的所有对象。这是非常广泛的,因为对于碰巧实现True
的实例或其他对象的方法,它也是__call__
。但这可能是你想要的 - 这取决于你是否只希望接受函数或其他可调用对象。
答案 2 :(得分:0)
使用键入。可调用: https://docs.python.org/3/library/typing.html
希望使用特定签名的回调函数的框架可以使用Callable [[Arg1Type,Arg2Type],ReturnType]提示类型。
例如:
通过键入import Callable
def feeder(get_next_item:Callable [[],str])->无: #身体
def async_query(on_success:可调用[[int],无], on_error:可调用[[int,Exception],无])->无: #Body可以通过替换文字来声明可调用对象的返回类型,而无需指定调用签名 类型提示中的参数列表的省略号:Callable [..., ReturnType]。