如何在类型提示中指定函数类型?

问题描述 投票:0回答:3

如何将变量的类型提示指定为函数类型?没有

typing.Function
,我在相关PEP中找不到任何内容,PEP 483

python mypy python-typing
3个回答
879
投票

正如 @jonrsharpe 在评论中指出的那样,这可以通过

typing.Callable
:

来完成
from typing import Callable

def my_function(func: Callable):

注意:

Callable
本身等同于
Callable[..., Any]
。 这样的
Callable
接受 any 数量和类型的参数 (
...
) 并返回 any 类型 (
Any
) 的值。如果这太不受约束,还可以指定输入参数列表的类型和返回类型。

例如,给定:

def sum(a: int, b: int) -> int: return a+b

对应的注释是:

Callable[[int, int], int]

也就是说,参数在外部订阅中下标,返回类型作为外部订阅中的第二个元素。一般来说:

Callable[[ParamType1, ParamType2, ..., ParamTypeN], ReturnType]

21
投票

另一个值得注意的有趣点是,您可以使用内置函数

type()
来获取内置函数的类型并使用它。 所以你可以拥有

def f(my_function: type(abs)) -> int:
    return my_function(100)

或者类似的东西


21
投票

我想要此功能的具体用例是在 PyCharm 中启用丰富的代码完成。使用

Callable
不会导致 PyCharm 表明该对象具有
.__code__
属性,这正是我想要的,在本例中。

我偶然发现了

types
模块并且..

from types import FunctionType

允许我用

FunctionType
注释对象,瞧,PyCharm 现在建议我的对象具有
.__code__
属性。

OP 不清楚为什么这种类型提示对他们有用。 Callable 当然适用于任何实现

.__call__()
的东西,但为了进一步澄清接口,我提交了
types
模块。

令人遗憾的是 Python 需要两个非常相似的模块。

© www.soinside.com 2019 - 2024. All rights reserved.