Python函数指针的类型

时间:2015-01-01 18:39:44

标签: python function python-3.x annotations function-pointers

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

3 个答案:

答案 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]。