如何正确使用Python中的函数注解(Function Annotation)来注释函数参数。

4

我希望我的函数被注释为接受另一个函数作为参数。起初我认为这样会很顺利:

def my_function(func_argument: function):
    pass

然而函数未解决的引用。我已经查看了内置函数,但是它确实不在那里,与我通常使用的str, int和其他函数不同。但是,它一定存在于某个地方,因为:

>>> def my_function():
...     pass
... 
>>> x = my_function
>>> type(x)
<class 'function'>
>>> type(x).__name__
'function'

函数类在哪里定义,为什么它不在内置函数中?我的原始尝试是否应该是正确的解决方案?目前我使用了 types.FunctionType 进行注释,但感觉不太对,因为我们在其他地方都使用 str 而非 types.StringType 进行提示。而且仅为一个注释导入 types 也很奇怪。 typing 库也没有任何可以帮助我替换这个的内容。
此外,如果使用类型注释强制执行库(我看到有几个这样的库),FunctionType 会如何工作?
1个回答

1

为什么不使用Callable

期望特定签名的回调函数的框架可以使用Callable[[Arg1Type, Arg2Type], ReturnType]进行类型提示。


from typing import Callable

def my_function(func_argument: Callable[..., ReturnType]): # replace ReturnType with return type of func_argument
    pass

我在typing中忽略了Callable,但实际上使用它非常有意义,因为它既适用于lambda又适用于函数。 我有点不喜欢它必须要有一个返回类型,因为并非所有函数都返回内容 - 那么它们是否应该将None作为第二个参数? 对于那些没有使用过typing库的人来说,这可能并不太清楚,但我认为这更多是一个typing问题,而不是SO的问题,谢谢 :) - iScrE4m
@iScrE4m None 可以用于那些不返回任何内容的函数,它们实际上返回的是 None - Moses Koledoye
啊,好的,非常感谢! - iScrE4m

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接