如何将变量的类型提示指定为函数类型?没有typing.Function,我在相关的PEP, PEP 483中找不到任何东西。
typing.Function
正如@jonrsharpe在注释中指出的那样,这可以用typing.Callable来完成:
typing.Callable
from typing import Callable def my_function(func: Callable):
注意: Callable本身等价于Callable[..., Any]。 这样的Callable接受任何参数的数量和类型(...),并返回一个任何类型的值(Any)。如果这太不受约束,还可以指定输入参数列表的类型和返回类型
Callable
Callable[..., Any]
...
Any
例如,给定:
def sum(a: int, b: int) -> int: return a+b
对应的注释为:
Callable[[int, int], int]
也就是说,参数在外部订阅中被子脚本化,返回类型作为外部订阅中的第二个元素。一般来说:
Callable[[ParamType1, ParamType2, .., ParamTypeN], ReturnType]
type()
def f(my_function: type(abs)) -> int: return my_function(100)
或者类似的形式
一个最简单和有趣的解决方案是:
def f(my_function: type(lambda x: None)): return my_function()
可以用以下方法证明:
def poww(num1, num2): return num1**num2 print(type(lambda x: None) == type(poww))
和输出将是: True < / p >
True
我想要这个功能的具体用例是在PyCharm中启用富代码补全。使用Callable并没有导致PyCharm建议对象具有.__code__属性,这是我在这种情况下想要的。
.__code__
我偶然发现types模块和..
types
from types import FunctionType
允许我用FunctionType注释对象,voilà, PyCharm现在建议我的对象具有.__code__属性。
FunctionType
OP不清楚为什么这个类型提示对他们有用。Callable当然适用于任何实现.__call__()的对象,但为了进一步澄清接口,我提交了types模块。
.__call__()
遗憾的是,Python需要两个非常相似的模块。
在python3中,它可以在没有import typing的情况下工作:
import typing
def my_function(other_function: callable): pass